【问题标题】:EditText in Alert Dialog Android警报对话框 Android 中的 EditText
【发布时间】:2019-09-05 03:11:18
【问题描述】:

我有一种在片段中创建警报对话框的方法

private void alertDialog() {
final EditText editTextField = new EditText(this.getContext());
AlertDialog dialog = new AlertDialog.Builder()
    .setTitle("Title")
    .setMessage("Message")
    .setView(editTextField)
    .setPositiveButton("OK", this)
    .setNegativeButton("Cancel", null)
    .create();
dialog.show();
}

然后我实现了DialogInterface.OnClickListener

public void onClick(DialogInterface dialogInterface, int i){
 switch(i){
    case DialogInterface.BUTTON_POSITIVE:
        String name = String.valueOf(editTextField.getText());
        break;
    case DialogInterface.BUTTON_NEGATIVE:
        break;
   }
 }

但是onClick 方法中的editTextField 无法引用警报对话框。有没有办法解决这个问题?或者唯一的方法是在警报对话框构建器中创建一个带有编辑文本和setView 的布局?

【问题讨论】:

  • 你的意思是当editText被点击时,什么都没有发生?
  • 不,editTextField.getText() 无法解析。 @约翰乔
  • @EricLow 您在 alertdialog 中将 edittext 声明为局部变量。您无法在该方法之外访问该变量
  • final EditText editTextField 是本地的,因此仅存在于 alertDialog() 方法中。因此,您无法在它之外访问它。您需要将其声明为全局
  • @Vladyslav Matviienko ,是的,我知道,但如果声明为全局,我无法执行 setView。错误显示NullPointerException:尝试调用虚拟方法'android.content.res.Resouces.

标签: android android-alertdialog


【解决方案1】:

您无法访问 editTextField 的原因是它被声明为 alertDialog() 方法中的局部变量。

如果您想将该变量保留为本地变量,则需要直接在该方法中设置侦听器方法,如下所示。

private EditText = new EditText(this);
AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("Title")
                .setMessage("Message")
                .setView(inputEditTextField)
                .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        String editTextInput = inputEditTextField.getText().toString();
                        Log.d("onclick","editext value is: "+ editTextInput);
                    }
                })
                .setNegativeButton("Cancel", null)
                .create();
dialog.show();


否则,您可以将 alertDialog() 方法中的这一行替换为以下行

editTextField = new EditText(this.getContext());


您需要在 onCreate 方法上方添加这一行

EditTextField editTextField;

【讨论】:

  • 我声明错了,你的回答也有帮助。非常感谢。
  • inputEditTextField 未找到
  • 将 inputEditTextField 替换为 editTextField
【解决方案2】:

在 Kotlin 上也是如此:

    val inputEditTextField = EditText(requireActivity())
    val dialog = AlertDialog.Builder(requireContext())
        .setTitle("Title")
        .setMessage("Message")
        .setView(inputEditTextField)
        .setPositiveButton("OK") { _, _ ->
                val editTextInput = inputEditTextField .text.toString()
                Timber.d("editext value is: $editTextInput")
        }
        .setNegativeButton("Cancel", null)
        .create()
    dialog.show()

【讨论】:

    【解决方案3】:

    使用这个

        EditText editText = new EditText(this);
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setTitle("Create group")
                .setMessage("Enter group name")
                .setView(editText)
                .setPositiveButton("OK", (dialogInterface, i) -> {
                    String editTextInput = editText.getText().toString();
                })
                .setNegativeButton("Cancel", null)
                .create();
        dialog.show();
    

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      相关资源
      最近更新 更多