我在Android中编写了以下代码。 “confirmmalert”功能实际上显示一个警告框,并有正负按钮。
但总是“其他”部分正在发挥作用,即使我没有选择任何东西也是如此。
请回复如何使其正常工作。
private void updatestockin()
{
if(confirmalert())
{
Toast t = Toast.makeText(getApplicationContext(), "Success",
Toast.LENGTH_SHORT);
t.show();
}
else
{
Toast t = Toast.makeText(getApplicationContext(), "User Rejected", Toast.LENGTH_SHORT);
t.show();
}
}
我的confirmalert
功能:
public boolean confirmalert(String title,String msg)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage(msg);
alertDialogBuilder.setTitle(title);
alertDialogBuilder.setPositiveButton("Ok",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface arg0, int arg1)
{
flag=true;
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface arg0, int arg1)
{
flag=false;
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
return flag;
}
答案 0 :(得分:2)
confirmmalert()方法立即返回(在屏幕上甚至显示AlertDialog之前),其中标志字段的值如果没有在您的班级中另外设置则为false。这是因为AlertDialog.show()是异步的,否则会阻塞主(ui)线程,并且在调用它之后你将无法再与该应用程序进行交互。
您需要做的是将调用移到 updatestockin()方法之外的 confirmalert(),并从Dialog.OnClickListener()调用updatestockin。
//call this from where you normally call updatestockin()
confirmalert();
//updatestockin(); // comment this call as it will happen after the user clicks one of the AlertDialog buttons
private void updatestockin(boolean flag) {
if (flag) {
Toast t = Toast.makeText(getApplicationContext(), "Success",
Toast.LENGTH_SHORT);
t.show();
} else {
Toast t = Toast.makeText(getApplicationContext(), "User Rejected", Toast.LENGTH_SHORT);
t.show();
}
}
public boolean confirmalert(String title,String msg)
{
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage(msg);
alertDialogBuilder.setTitle(title);
alertDialogBuilder.setPositiveButton("Ok",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface arg0, int arg1)
{
updatestockin(true);
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface arg0, int arg1)
{
updatestockin(false);
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
return flag;
}
答案 1 :(得分:1)
我认为存在异步问题。所以也许这个警报在不同的线程中。因此,由于您的标志初始化为false,因此会运行该标志。
因此,使用wait()和notify()可以同步线程 试试这个:
public boolean confirmalert(String title,String msg)
{
wait();
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
alertDialogBuilder.setMessage(msg);
alertDialogBuilder.setTitle(title);
alertDialogBuilder.setPositiveButton("Ok",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface arg0, int arg1)
{
flag=true;
notify();
}
});
alertDialogBuilder.setNegativeButton("Cancel",
new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface arg0, int arg1)
{
flag=false;
notify();
}
});
AlertDialog alertDialog = alertDialogBuilder.create();
alertDialog.show();
wait();
return flag;
}
它应该工作。未经测试。如果可能的话,请阅读等待并通知一点以便正确理解,希望它能带你走正确路径。