在我的应用程序中,我创建了一个接受密码的对话框。在对话框中,存在一条消息,一个EditText和两个按钮(一个+ ve和一个-ve)。当用户点击+ ve按钮时,我正在检查在EditText中输入的密码是否有效。如果无效,我必须更改对话框的消息,提示用户再次重新输入密码。
如果密码有效,则按预期工作,但它无效,而不是更新消息,只是关闭对话框。
我已经尝试通过覆盖 onPrepareDialog()来解决它,但它也无效。
这是我的代码:
protected Dialog onCreateDialog(int viewId){
AlertDialog dialog = null;
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Enter Password To Continue");
final EditText passwordField = new EditText(getApplicationContext());
builder.setView(passwordField);
builder.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(passwordField.getText().toString().equals("password")){
Intent intent = new Intent(MyFirstActivity.this, NextActivity.class);
finish();
startActivity(intent);
}else{
//Here I need to update the message
builder.setMessage("SORRY!!! Wrong Password Entered.\n Re-Enter Correct Password Again ");
}
}
});
builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog = builder.create();
}
return dialog;
}
答案 0 :(得分:2)
我认为这里有两个问题。
如果我没记错,AlertDialog上的PositiveButton的默认行为将关闭对话框。我认为这就是为什么你的密码错误时你会关闭的原因。我想如果你切换到
builder.setNeutralButton(...);
按下时不会关闭对话框。
您正在更改Builder上的消息而不是Dialog本身。我认为Builder不会动态改变Dialog在创建和显示后的外观。
dialog.setMessage("WRONG PASSWORD");
会为你改变它。如果没有,那么你必须制作一个TextView并将其添加到对话框builder.setView(mTxt);
,然后你可以在你的参考上调用setText();
,它将改变屏幕上的文字。
我认为比其中任何一个更好的解决方案可能是Toast弹出窗口。用户刚刚输入了密码并按下了提交,因此我认为可以指望他们查看屏幕。许多其他具有登录页面的应用程序使用Toast消息告诉用户他们是否输入了密码错误,因此我认为您不会混淆用户或其他任何东西,这是一种常见的设计模式。
修改强>
AlertDialog类肯定有一个setMessage()方法。 see the docs here。它位于文档页面的底部附近,因此当您正确单击链接时,它不会将其滚动到顶部。但它就在那里,对我来说,从第三位下来。在setInverseBackgroundForced
和setTitle
之间
编辑2:
我实现了类似于你之前尝试做的事情。我不得不使用自己的自定义侦听器对象和我认为的对话框按钮,以使它们在被按下时不会隐藏对话框。
以下是我创建和显示对话框的方法:
AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);
builder.setCancelable(false)
.setMessage("Please Enter Something")
.setPositiveButton("Enter", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
//All of the fun happens inside the CustomListener now.
//I had to move it to enable data validation.
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
Button theButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
theButton.setOnClickListener(new CustomListener(alertDialog));
然后我在我的Activity里面创建了一个名为CustomListener的Inner类,如下所示:
class CustomListener implements View.OnClickListener {
private final Dialog dialog;
public CustomListener(Dialog dialog) {
this.dialog = dialog;
}
@Override
public void onClick(View v) {
if(passwordField.getText().toString().equals("password")){
//Password is correct.
} else { //Password is incorrect.
((AlertDialog)dialog).setMessage("WRONG");
}
}
}
以这种方式设置监听器时,按下按钮时不会自动关闭对话框。
答案 1 :(得分:0)
虽然 Tim 提供的答案是正确的,但我仍然会发布我的答案,以帮助那些希望将来有更多替代答案的人。
经过长时间的搜索,我通过覆盖 onShow()方法以另一种方式解决了这个问题。
@Override
protected Dialog onCreateDialog(int viewId){
AlertDialog dialog;
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Enter Password To Continue");
final TextView message = new TextView(getApplicationContext());
message.setText("Enter Password To Continue");
builder.setView(message);
final EditText passwordField = new EditText(getApplicationContext());
builder.setView(passwordField);
builder.setPositiveButton("SUBMIT", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//Do Nothing
}
});
builder.setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
dialog = builder.create();
dialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(final DialogInterface dialog) {
// TODO Auto-generated method stub
Button b = ((AlertDialog) dialog).getButton(AlertDialog.BUTTON_POSITIVE);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(passwordField.getText().toString().equals("password")){
Intent intent = new Intent(PuzzleHome.this, PuzzleMaker.class);
startActivity(intent);
}else{
((AlertDialog) dialog).setMessage("SORRY!!! Wrong Password Entered.\n Re-Enter Correct Password Again");
}
}
});
}
});
}
return dialog;
}