2012-12-03 48 views
5

Tôi đã viết một hàm có giá trị trả về kiểu int, và trong hàm này tôi cần bật lên một AlertDialog bằng hai nút. Khi nút "Có" được nhấp, hàm trả về 0 và nút "Không" trả về -1.AlertDialog trong một hàm có giá trị trả về

public int Func(){ 
    final AlertDialog d=new AlertDialog.Builder(mContext).setTitle("Warning").setCancelable(false).setMessage 
         (alert) 
         .setPositiveButton("Yes",mListener).setNegativeButton("No",mListener).create(); 
         d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
         d.show(); 
    if(mWhich.getWhich()==-1) //the "yes" button was clicked 
     return 0; 
    else      //the "no" button was clicked 
     return -1; 
} 

mWhich là một lớp được sử dụng để ghi lại các lựa chọn sử dụng

private DialogInterface.OnClickListener mListener = 
      new DialogInterface.OnClickListener() { 

       public void onClick(DialogInterface dialog, int which) { 
        mWhich.setWhich(which); 
          } 
      }; 

Bây giờ vấn đề là mã

if(mWhich.getWhich()==-1) 
     return 0; 
    else 
     return -1; 

được thực hiện trước khi người dùng nhấp vào yes hoặc no nút, làm thế nào tôi nên làm gì ??

+0

những gì bạn nhận được khi nút Có hoặc Không được nhấn khi chạy mã hiện tại –

+0

lấy biến số nguyên trên toàn cầu và gán giá trị trong đó (0 hoặc 1) và sau đó kiểm tra giá trị của nó. –

+1

Hộp thoại cảnh báo KHÔNG PHẢI là phương thức. – Doomsknight

Trả lời

0

Tôi không nghĩ rằng nó có thể là cách bạn làm điều đó bởi vì Func() có lẽ sẽ kết thúc thực hiện trước khi người dùng nhấp vào một trong các nút. Nó sẽ không thể thay đổi giá trị trả về của phương thức sau khi nó thực hiện xong.

Vì bạn đã lưu trữ which sử dụng mWhich.setWhich(which);. Bạn có thể đọc giá trị sau này bằng cách sử dụng một hàm khác.

private DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     mWhich.setWhich(which); 
    } 
}; 

public void showDialog() { 
    final AlertDialog d = new AlertDialog.Builder(mContext).setTitle("Warning") 
      .setCancelable(false).setMessage(alert).setPositiveButton("Yes", mListener) 
      .setNegativeButton("No", mListener).create(); 
    d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 
    d.show(); 
} 

public int func() { 
    if (mWhich.getWhich() == -1) 
     // the "yes" button was clicked 
     return 0; 
    else 
     // the "no" button was clicked 
     return -1; 
} 
+0

Cảm ơn câu trả lời của bạn. Nhưng tôi không nghĩ nó hoạt động. Bởi vì tôi muốn đọc giá trị khi nút được nhấp vào – Caroline

+0

@zhouqihui Chính xác thì bạn đang cố gắng thực hiện điều gì? Nếu bạn có thể cho chúng tôi biết, tôi nghĩ cộng đồng có thể đưa ra các giải pháp tốt hơn. –

+0

Tôi muốn quyết định giá trị trả về của Func() dựa trên lựa chọn của người dùng là "Có" hoặc "Không". Cả hai hoạt động bật lên AlertDialog và quyết định dựa trên sự lựa chọn của người dùng là trong Func(). Trong Func() , Đầu tiên tôi làm điều gì đó và nhận được kết quả, sau đó tôi trình bày kết quả đó cho người dùng trên AlertDialog bằng nút "Có" và "Không". Khi người dùng nhấp vào "Có", Func() trả về 0, "Không" trả về -1. – Caroline

2

Như tôi hiểu, mã của bạn trông giống như

// some code 
int result = Func(); 
DoSmthWithResult(result); 
// some code 

bạn Func đang chạy trên thread UI, vì vậy sau khi bạn tạo hộp thoại nó tiếp tục thực hiện và trả về giá trị ban đầu của mWich. Bạn nên gọi DoSmthWithResult từ onClickListener thay vì:

private DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() { 
    public void onClick(DialogInterface dialog, int which) { 
     DoSmthWithresult(which == -1 ? 0 : -1); 
    } 
}; 

Bây giờ DoSmthWithResult sẽ được thực hiện sau hoặc nút "không" người dùng nhấn "yes".

+0

Cảm ơn bạn đã trả lời. Nhưng tôi không thể đặt DoSmthWithresult (trong đó == -1? 0: -1); trong chức năng onClick, bởi vì tôi gọi Func() ở một số nơi, và hoạt động sau này khác ở những nơi này. – Caroline

0

Mặc dù chắc chắn đó là cách Android để sử dụng người nghe và bắt đầu phân cấp cuộc gọi mới khi nhấp (như Yuriy và Binoy đã đề xuất), có thể cần thiết để có hộp thoại chặn. Tôi nhận ra rằng bằng cách bắt đầu một Thread mới với looper của chính nó sẽ hiển thị hộp thoại. Bằng cách đó, chuỗi ui là miễn phí để chạy, nhưng không dẫn đến ANR.

0

tôi đã cần thiết cùng các chức năng để hiển thị hộp thoại xác nhận, và đây là cách giải quyết của tôi:

Func() của bạn có thể giống như messageDialog() của tôi trên con đường này:

public static void messageDialog(Context context, String title, String bt_ok, String bt_cancel, final Runnable if_ok, final Runnable if_cancel) { 

     AlertDialog.Builder alert = new AlertDialog.Builder(context); 

     alert.setTitle(title); 

     alert.setPositiveButton(bt_ok.toUpperCase(), 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 

         if(if_ok!=null) if_ok.run(); 

        } 
       }); 
     alert.setNegativeButton(bt_cancel.toUpperCase(), 
       new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int whichButton) { 

         if(if_cancel!=null) if_cancel.run(); 

        } 
       }); 

     alert.show(); 

    } 

và gọi messageDialog() trên đường này:

Runnable ifTrue = new Runnable() { 
     @Override 
     public void run() { 
      //put here your YES onClick stuff 
     } 
    }; 

    String msg = "Do you really want to do this?"; 

    ALITEC.Dialogs.messageDialog(this, msg, "Yes", "No", ifTrue, null); 

Khi không bấm nút, tôi không làm gì cả ...nhưng nếu bạn muốn:

Runnable ifFalse = new Runnable() { 
     @Override 
     public void run() { 
      //put here your NO onClick stuff 
     } 
    }; 

và sau đó gọi

messageDialog (this, msg, "Có", "Không", ifTrue, ifFalse);

thay

messageDialog (this, msg, "Có", "Không", ifTrue, null);

Đó là tất cả!

Trân trọng!

Các vấn đề liên quan