我有一个带有textView的小型userprofile表,例如[email],右边有一个[button]来更改地址。
当我点击按钮时,会打开一个带有EditText输入的小型DialogWindow,以便用户可以使用肯定按钮应用该值。
但是有一种恼人的效果我不知道如何解决。创建EditTextDialog后,我想要干燥输入值。 (见下面的代码) 但我的第一个按钮点击不等待对话框中的正面按钮点击。所以在输入输入之前会立即'空'烤。
Button btnChangeEmail = (Button) getView().findViewById(R.id.btn_settings_changeemail);
btnChangeEmail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyDialogBuilder myDialogBuilder = new MyDialogBuilder(getString(R.string.changeemail), getActivity());
myDialogBuilder.createEditTextInputDialog();
myDialogBuilder.toastInput();
}
});
在按钮上我想将输入字符串存储在对象中。实际上我想要事后干杯或做一些其他的调用,比如把它发送到MySQL-DB。但我需要尽可能灵活,以便我可以称之为makeInputDialog().toastTheInput().andSendItToWeb()
等等。但正如已经说过的那样......根本没有字符串,因为第一个按钮不等待第二个按钮。
我需要改变什么?在此先感谢。
这是我的对话框Builder类:
public class MyDialogBuilder {
String caption;
String input;
Context mContext;
public MyDialogBuilder(String caption, Context mContext) {
this.caption = caption;
this.mContext = mContext;
}
MyDialogBuilder setInputValue(String value) {
this.input = value;
return this;
}
MyDialogBuilder createEditTextInputDialog() {
LayoutInflater inflater = LayoutInflater.from(mContext);
View inputDialogView = inflater.inflate(R.layout.dialog_input_edittext, null);
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setView(inputDialogView);
final EditText etInput = (EditText) inputDialogView.findViewById(R.id.et_inputdialog);
final TextView tvCaption = (TextView) inputDialogView.findViewById(R.id.tv_inputdialog_caption);
tvCaption.setText(caption);
builder.setCancelable(true)
.setPositiveButton(R.string.apply, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setInputValue(etInput.getText().toString());
}
}).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
return this;
}
MyDialogBuilder toastInput() {
Toast.makeText(mContext, input, Toast.LENGTH_SHORT).show();
return this;
}
}
答案 0 :(得分:3)
在构建器模式中,您只需构建情境,而不是立即执行。您应该稍后应用更改并进行检查:
public class MyDialogBuilder {
String caption;
String input;
Context mContext;
boolean showToast;
public MyDialogBuilder(String caption, Context mContext) {
this.caption = caption;
this.mContext = mContext;
}
MyDialogBuilder setInputValue(String value) {
this.input = value;
return this;
}
MyDialogBuilder createEditTextInputDialog() {
LayoutInflater inflater = LayoutInflater.from(mContext);
View inputDialogView = inflater.inflate(R.layout.dialog_input_edittext, null);
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setView(inputDialogView);
final EditText etInput = (EditText) inputDialogView.findViewById(R.id.et_inputdialog);
final TextView tvCaption = (TextView) inputDialogView.findViewById(R.id.tv_inputdialog_caption);
tvCaption.setText(caption);
builder.setCancelable(true)
.setPositiveButton(R.string.apply, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setInputValue(etInput.getText().toString());
// Toast here
if (showToast) {
Toast.makeText(mContext, input, Toast.LENGTH_SHORT).show();
}
}
}).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
return this;
}
MyDialogBuilder toastInput() {
// Set here to show toast or not
showToast = true;
return this;
}
}
所以在toastInput()中你明确表示应该显示一个toast,然后检查该boolean是否设置为true,如果是,则显示toast。
答案 1 :(得分:1)
MyDialogBuilder toastInput() {
Toast.makeText(mContext, input, Toast.LENGTH_SHORT).show();
return this;
}
用以下代码替换上面的代码。
MyDialogBuilder toastInput() {
if(null != input){
Toast.makeText(mContext, input, Toast.LENGTH_SHORT).show();
}
return this;
}
答案 2 :(得分:1)
你需要让正面按钮触发你的祝酒词:
MyDialogBuilder createEditTextInputDialog() {
...
builder.setCancelable(true)
.setPositiveButton(R.string.apply, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
setInputValue(etInput.getText().toString());
// check logic to show the toast
showToast(etInput.getText().toString());
}
}).setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
然后创建一个显示吐司的方法:
void showToast(String msg) {
Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
}
您可以使用现有的逻辑来检查是否应该显示吐司,但是这样可以确保只在单击肯定按钮时调用toast方法(或检查是否应显示吐司的方法)。