2013-07-27 36 views
5

在大多数情况下,我需要用户多次作出选择(我做了一些事情并为用户提出一个消息框以供选择并继续做其他事情(也许称为块)) 所以我写了一个共同的功能如何使用AlertDialog的返回值

public static void ShowMsgDialog(Context self,String title, String msg) 

虽然正确地响应用户的动作,但始终悬而未决(这意味着当我按一下按钮,之前的动作的价值是全局变量的值,可见光) 有存在任何我可以获得消息框的返回值并使用它的功能:

int ret = ShowMsgDialog(Context self,String title, String msg); 

后续是我的代码:

public class MainActivity extends Activity { 
    private Button button1; 
    enum Answer { YES, NO, ERROR}; 
    static Answer choice; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);  
     button1 = (Button)findViewById(R.id.button1); 

     button1.setOnClickListener(new OnClickListener() {   
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       ShowMsgDialog(MainActivity.this, "Information", "you choice? "); 
       if(choice == Answer.YES) 
        Toast.makeText(MainActivity.this, "YOU CHOICED YES", Toast.LENGTH_LONG).show(); 
       else if (choice == Answer.NO) 
        Toast.makeText(MainActivity.this, "YOU CHOICED NO", Toast.LENGTH_LONG).show(); 
       else 
        Toast.makeText(MainActivity.this, "ERROR OCUS", Toast.LENGTH_LONG).show(); 

       //int ret = ShowMsgDialog(MainActivity.this, "Information", "you choice? "); 
      } 
     });  
    } 

    public static void ShowMsgDialog(Context self,String title, String Msg){ 
     AlertDialog.Builder dlgAlert = new AlertDialog.Builder(self); 
     dlgAlert.setTitle(title); 
     dlgAlert.setMessage(Msg); 
     dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       // call your code here 
       choice = Answer.YES; 
      } 
     }); 
     dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       choice = Answer.NO; 
      } 
     }); 
     dlgAlert.show(); 
    } 



} 

回答

7

我不认为有任何方式从alertDialog 得到的值这样

int ret = ShowMsgDialog(Context self,String title, String msg); 

因为当你的对话框将显示你的Button的onClick()已经完成。

所以我建议使用另一种方式来实现这一点。

自创建alertDialog的方法是你的活动里面是象下面这样的活动创建一个功能简单:

public void userChose(String choise){ 

     if(choice == Answer.YES) 
      //YOUR CODE FOR YES HERE 
      Toast.makeText(MainActivity.this, "YOU CHOSE YES", Toast.LENGTH_LONG).show(); 
     else if (choice == Answer.NO) 
      //YOUR CODE FOR NO HERE 
      Toast.makeText(MainActivity.this, "YOU CHOSE NO", Toast.LENGTH_LONG).show(); 

} 

,并致电中的onClick()方法

这样:

 dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       userChose(Answer.YES); 
      } 
     }); 
     dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       userChose(Answer.NO); 
      } 
     }); 
+0

在不同的功能,我打算用函数的返回值。如果使用全局变量,那么我不知道 – George

+0

哪个函数调用的值取得了答案变量的值,我不知道 – George

+0

我不明白你的意思是抱歉,你能写得更好吗? :S,但我相信获得返回值的唯一有效解决方案是调用另一个函数,它将根据您的需要更新您的UI,因为当您显示AlertDialog时,无法确定何时会关闭对话框从用户,你不能只是暂停UI线程,并等待,直到从alertDialog返回值。所以你需要使用像我的例子。 – ManosProm

0

你需要显示在敬酒的正面和负面按钮的Click事件。因为当你点击按钮时,警报出现,之后如果条件执行,以便你从上次打开的警报视图按钮点击有价值。所以它是错的。试试这个:

public static void ShowMsgDialog(Context self,String title, String Msg){ 
     AlertDialog.Builder dlgAlert = new AlertDialog.Builder(self); 
     dlgAlert.setTitle(title); 
     dlgAlert.setMessage(Msg); 
     dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton) { 
       // call your code here 
       choice = Answer.YES; 
       Toast.makeText(MainActivity.this, "YOU CHOICED YES", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // TODO Auto-generated method stub 
       choice = Answer.NO; 
       Toast.makeText(MainActivity.this, "YOU CHOICED NO", Toast.LENGTH_LONG).show(); 
      } 
     }); 
     dlgAlert.show(); 
    } 
+0

Toast a message is a sample,realities我使用其他代码来代替它,我的意思是使用AlertDialog的返回值。 – George

+0

如果不点击它,您无法获得alertbutton点击的返回值。所以你需要做一些警报按钮点击。使用警报按钮值调用任何按钮点击功能。 –

0

虽然你不能直接从AlertDialog返回一个值,你可以在答案发送到活动的处理程序:

public static void ShowMsgDialog(Context self,String title, String Msg){ 
    AlertDialog.Builder dlgAlert = new AlertDialog.Builder(self); 
    dlgAlert.setTitle(title); 
    dlgAlert.setMessage(Msg); 
    dlgAlert.setPositiveButton("OK",new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int whichButton) { 
      // call your code here 
      Message msg = Message.obtain(); 
      msg.arg1 = HandlerMessage.Yes.ordinal(); 
      mHandler.sendMessage(msg);     
     } 
    }); 
    dlgAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      // TODO Auto-generated method stub 
      Message msg = Message.obtain(); 
      msg.arg1 = HandlerMessage.No.ordinal(); 
      mHandler.sendMessage(msg); 
     } 
    }); 
    dlgAlert.show(); 
} 

enum HandlerMessage 
{ 
    Yes, 
    No 
} 

/** for posting authentication attempts back to UI thread */ 
private final IncomingHandler mHandler = new IncomingHandler(this); 

static class IncomingHandler extends Handler 
{ 
    private final WeakReference<MainActivity> mActivityWeakReference; 

    IncomingHandler(MainActivity activity) 
    { 
     mActivityWeakReference = new WeakReference<MainActivity>(activity); 
    } 

    @Override 
    public void handleMessage(Message msg) 
    { 
     MainActivity activity = mActivityWeakReference.get(); 
     if (activity != null) 
     { 
      activity.HandleMessage(msg); 
     } 
    } 
} 
public void HandleMessage(Message msg) 
{ 
    HandlerMessage handlerMessage = HandlerMessage.values()[msg.arg1]; 

    switch(handlerMessage){ 
     case Yes: 
       //Do something ... 
       break; 
      case No: 
       //Do something ... 
       break; 
}