2012-12-03 45 views
5

我寫了一個函數,它的返回值類型爲int,在這個函數中我需要用兩個按鈕彈出一個AlertDialog。當單擊「是」按鈕時,該函數返回0,「否」按鈕返回-1。具有返回值的函數中的AlertDialog

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是用來記錄用戶的選擇

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

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

類現在的問題是

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

用戶單擊Yes或No按鈕之前執行的代碼,如何我應該怎麼做?

+0

當運行當前代碼時按下是或否按鈕時得到的結果 –

+0

全局取整數變量並在其中賦值(0或1),稍後檢查它的值。 –

+1

警報對話框不是模態。 – Doomsknight

回答

0

我不認爲這是可能的方式,因爲Func()可能會在用戶點擊任一按鈕之前完成執行。在完成執行之後,不可能更改該方法的返回值。

由於您已經使用mWhich.setWhich(which);存儲which。您可以稍後使用其他功能讀取該值。

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

感謝您的回答。但我不認爲它有效。因爲一旦按鈕被點擊,我想讀取這個值 – Caroline

+0

@zhouqihui你究竟想要完成什麼?如果你能告訴我們,我認爲社區可以提出更好的解決方案。 –

+0

我想根據用戶選擇「是」或「否」來決定Func()的返回值。彈出AlertDialog的操作和基於用戶選擇的決定都在Func()中。在Func()中,我首先做了一些事情並得到了一個結果,然後我通過按鈕「Yes」和「No」將該結果呈現給AlertDialog上的用戶。當用戶單擊「是」時,Func()返回0,「否」返回-1。 – Caroline

2

我的理解,你的代碼類似於

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

Func在UI線程上運行,所以在創建對話框中,可以繼續執行,並返回mWich初始值。你應該叫DoSmthWithResultonClickListener代替:

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

現在DoSmthWithResult會後用戶按下「是」或「否」按鈕執行。

+0

謝謝你的回答。但是我不能把DoSmthWithresult(which == -1?0:-1);在onClick函數中,因爲我在幾個地方調用了Func(),並且後面的操作在這些地方是不同的。 – Caroline

0

雖然它當然是android的方式來使用一個偵聽器,並點擊開始一個新的調用層次結構(如Yuriy和Binoy建議),可能有必要獲得阻止對話框。我意識到通過自己的循環來啓動一個新的線程來顯示對話框。這樣ui線程可以自由運行,但不會導致ANR。

0

我需要相同的功能,顯示確認對話框,這裏是我的解決方法:

Func()可以像這樣我的messageDialog()

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(); 

    } 

,並呼籲這樣messageDialog()

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); 

在沒有按鈕的時候,我沒有做任何事情......但如果你想:

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

,然後調用

messageDialog(這一點,味精, 「是」, 「否」,ifTrue,ifFalse);

代替

messageDialog(這一點,味精, 「是」, 「否」,ifTrue,NULL);

就這樣!

此致敬禮!