在 android 工作室中按键盘上的 Enter 键提交包含 EditText 的 AlertDialog.Builder

Submit an AlertDialog.Builder containing an EditText by pressing enter on the keyboard in android studio

这是我的 AlertDialog.Builder 代码,它具有带 EditText 的自定义视图。在 EditText 中输入值后,我希望按键盘上的 Enter 键与 AlertDialog.Builder 的 PositiveButton 一样。我在 XML 文件中包含了必要的 'imeOptions' 部分。我设法在按 Enter 时执行代码,但 AlertDialog.Builder 仍在屏幕上并且不会像单击 AlertDialog.Builder 上的 PositiveButton 时那样消失。

    //AlertDialog to set weekly income
    incomeAlert = new AlertDialog.Builder(this);
    incomeInflater = this.getLayoutInflater();
    incomeDialogView = incomeInflater.inflate(R.layout.activity_weekincome, null);
    incomeAlert.setView(incomeDialogView);
    et_WeekIncome = incomeDialogView.findViewById(R.id.ls_WeekIncome);
    et_WeekIncome.setOnEditorActionListener(new EditText.OnEditorActionListener() {
        @Override
        public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
            if (actionId == EditorInfo.IME_ACTION_DONE) {
                submitIncome();
                return true;
            }
            return false;
        }
    });
    incomeAlert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int whichButton) {
            submitIncome();
        }
    });

在此先感谢您的帮助。

更新:我通过添加另一段代码成功地关闭了 AlertDialog.Builder,如下所示

        AlertDialog incomeDialog = incomeAlert.create();
        incomeDialog.show();

然后需要解雇的时候,我用

        incomeDialog.dismiss();

由于 AlertDialog.Builder 不提供 dismiss(),我不得不通过 AlertDialog 创建生成器。然后我在 AlertDialog 上调用 dismiss()。

谢谢大家的意见。

您可以将 OnKeyListener 与您的编辑文本结合使用来处理特定的按键操作。

mEditTV.setOnKeyListener(new View.OnKeyListener() {

    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_ENTER) {
            // do action
            return true;
        }
        return false;
    }
});

可以这样使用上面的setOnKeyListener

et_WeekIncome.setOnKeyListener(new OnKeyListener(){
public boolean onKey(View v, int keyCode, KeyEvent event)
{
    if (event.getAction() == KeyEvent.ACTION_DOWN)
    {
        switch (keyCode)
        {
          case KeyEvent.KEYCODE_ENTER:
            submitIncome();
            return true;

          default:
            break;
        }
      }return false;
     }
});

Since dismiss() is not available with AlertDialog.Builder, I had to create the Builder through an AlertDialog. Then I call dismiss() on the AlertDialog.

还有一种方法可以解决这个问题:使用setOnShowListener回调来设置按键监听。这使您可以访问对话框的 dismiss() 方法。

incomeAlert.setOnShowListener((DialogInterface d) -> {
    et_WeekIncome.setOnKeyListener((v, keyCode, event) -> {
        if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) {
            onClick(dialog, BUTTON_POSITIVE);
            d.dismiss();
            return true;
        }
        return false;
    });