在大多数情况下,我需要用户多次做出选择。(我做了一些事情并提出一个消息框让用户做出选择并继续做其他事情(可能称为阻止)) 所以我写了一个通用函数
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();
}
}
我认为没有任何方法可以从alertDialog中获取值 像这样
int ret = ShowMsgDialog(Context self,String title, String msg);
因为当您的对话框显示时,按钮的 onClick() 已经完成。
所以我建议使用另一种方式来实现这一点。
由于创建警报对话框的方法位于您的活动内部,因此就像在活动中创建函数一样简单,如下所示:
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);
}
});
您需要在正向和负向按钮单击事件中显示 toast。因为当您单击按钮时,警报会显示,之后 if 条件执行,以便您从上次打开的警报视图按钮单击中获得值。所以它是错误的。试试这个:
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();
}
虽然您无法直接从 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;
}
可以使用
Interface
(至少适用于 Java 8 和 Java 11):
interface ResultHandler {
void result(Answer choice);
}
Swift (iOS) 有一个非常有用的概念,称为“完成处理程序”,它是一个(子)函数,在操作完成后调用,并且还可以将结果传递回调用函数。这以类似的方式工作(但使用 Java):
您将处理程序作为参数传递给第二个函数,在需要时调用其函数,然后可以在第一个函数中处理结果。最棒的是,这也适用于两个不同类的函数,它会立即返回到调用函数,并且可以从这个“子函数”中访问调用函数的变量(尽管它们可能必须是
final
) ).
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) {
...
ShowMsgDialog(MainActivity.this, "Information", "you choice? ", new ResultHandler() {
@Override
public void result(boolean myresult) {
//Do something with the result here
}
});
}
});
}
public static void ShowMsgDialog(Context self,String title, String Msg, ResultHandler handler){
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) {
handler.result(Answer.YES);
}
});
...
dlgAlert.show();
}
当然,这也适用于多个参数。