我使用的AlertDialog非常简单,只是带有文本框的自定义视图,以及alertdialog肯定提交按钮。我想验证文本框是否在用户解除对话框之前输入了文本。我看到了两种可能性,每种都有问题:
使用AlertDialog(与自定义对话框相比)是否可以使用其中任何一个选项?
我认为第二种选择是最简单的,但是如果可能的话,我也要努力。
答案 0 :(得分:5)
我将TextWatcher设置为输入字段,然后在满足验证条件时启用肯定按钮。我默认禁用了正面按钮。
AlertDialog.Builder builder = new AlertDialog.Builder(getSherlockActivity());
final View dialogView = LayoutInflater.from(getSherlockActivity()).inflate(R.layout.create_playlist, null);
final EditText inputField = (EditText) dialogView.findViewById(R.id.edit_newPlaylistName);
... //proceed to setup dialog using builder
final AlertDialog alertDialog = builder.show();
alertDialog.setCanceledOnTouchOutside(true);
final Button button = alertDialog.getButton(AlertDialog.BUTTON_POSITIVE);
button.setEnabled(false);
inputField.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// my validation condition
if (inputField.getText().length() > 0) {
button.setEnabled(true);
} else {
button.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
答案 1 :(得分:3)
我认为最简单的方法是在xml文件中定义自己的对话框。然后你可以非常简单地显示它(在这个例子中活动类的某个地方):
Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.your_dialog_file);
Button yourButton = dialog.findViewById(R.id.yourButton);
final EditText text = dialog.findViewById(R.id.yourTextEdit);
yourButton.setOnClickListener( {
public void onClick(View view) {
if ( ! (text.getText().toString.equals(""))) {
//go on here and dismiss dialog
}
});
答案 2 :(得分:1)
如果输入无效,这里有一种验证输入并在屏幕上保留警告对话框的方法。实际上,它删除了对话框并提供了它的新副本。
在你的setPostiveButton的onClick函数中,进行验证。 如果事情不是他们应该的,请向用户显示Toast。 然后在对话框中调用removeDialog。 然后 - 这是棘手的部分,异步调用对话框中的showDialog(如果适用,使用args)。 另外:为了不丢失用户的输入,您应该将他们输入的值放入您调用对话框的包中。当然,对话框的设置代码需要在包中查找这些值并适当地预填充对话框字段。
所以你的代码看起来像这样:
alert.setPositiveButton(id,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton)
{
if ((your validation conditions)) {
// validation conditions not satisfied
removeDialog(myDialogId);
Toast.makeText(blah blah).show();
// now create a new args bundle for the dialog
Bundle newArgs = new Bundle();
// now copy whatever you need from the args used to invoke to dialog
newArgs.putIntegerArrayList("items", myList);
// now save the user's input in a bundle
newArgs.putString("dialogToFieldContent", toString);
final Bundle finalArgs = newArgs;
Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
showDialog(myDialogId, finalArgs);
}
});
}
else {
// if everything is ok
}
}
});