【问题标题】:Get back key event on EditText取回 EditText 上的关键事件
【发布时间】:2011-07-04 01:28:57
【问题描述】:

如何处理在 EditText 上键入时按返回键的事件?当显示虚拟键盘并且用户按回时,它会被隐藏。我想处理这个事件,但是在 EditText 中设置 OnKeyListener 并没有帮助。

【问题讨论】:

  • 以下答案现在都不起作用,有没有更新的方法?

标签: android listener android-edittext


【解决方案1】:

谢谢雷诺。它可能似乎有效,但我设法以不同的方式解决它。

我覆盖了 EditText 的 onKeyPreIme(int keyCode, KeyEvent event)。此方法拦截 IME 上的按键。 =D

public boolean onKeyPreIme(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && 
        event.getAction() == KeyEvent.ACTION_UP) {
            // do your stuff
            return false;
    }
    return super.dispatchKeyEvent(event);
}

【讨论】:

  • 如果您想在 Edittext 以外的任何其他布局中处理,请参阅此链接 stackoverflow.com/a/5811630/341443。它工作正常
  • 对不起,如何覆盖 EditText 的 onKeyPreIme(int keyCode, KeyEvent event)。
  • @umitems 您需要扩展 EditText 类并从那里覆盖 onKeyPreIme 方法。然后,在您的 xml 中,您需要使用 com.your.package.CustomEditText 而不是使用EditText。见这里:stackoverflow.com/a/28719420/1421014
  • 谢谢,顺便说一句,为什么我看不到你的名字?
【解决方案2】:

这不起作用?

edText.setOnKeyListener(new OnKeyListener()
    {
        public boolean onKey(View v, int keyCode, KeyEvent event)
        {
            if (event.getAction() == KeyEvent.ACTION_DOWN)
            {
                //check if the right key was pressed
                if (keyCode == KeyEvent.KEYCODE_BACK)
                {

                    return true;
                }
            }
            return false;
        }
    });

编辑

好吧,这很令人沮丧。 Android 不会在 qwerty 键盘关闭时发送 IME 事件。 This is the only workaround 我遇到了。我希望它也对你有用。

【讨论】:

  • 哦,你想阻止键盘不工作吗?那你打算怎么让用户去做呢?
  • 不,我不想阻止键盘关闭。当键盘按下时,我将在视图上启动动画。
  • 它不起作用。你应该使用 onKeyPreIme。你提到的方法适用于 enter 和其他键......为什么你得到 15 票?大声笑
【解决方案3】:

我不知道为什么会这样,但是如果您只是在自定义 EditText 上完全覆盖 onKeyPreIme,则 OnKeyListener 可以工作。

customEditText.setOnKeyListener((v, keyCode, event) -> {
            if(event.getAction() == KeyEvent.ACTION_DOWN) {
                switch (keyCode) {
                    case KeyEvent.KEYCODE_BACK:
                        getPresenter().onBackPressed();
                        break;
                }
            }
            return false;
        }); 

@Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {
        return super.dispatchKeyEvent(event);
    }

【讨论】:

    【解决方案4】:

    SearchView 中没有其他答案对我有用,我终于在我的自定义视图中覆盖了 dispatchKeyEventPreIme(...) 方法:

    class ImeAwareSearchView @JvmOverloads constructor(
        context: Context?,
        attrs: AttributeSet? = null,
        defStyleAttr: Int = 0
    ) : SearchView(context, attrs, defStyleAttr) {
    
        var onKeyEventPreImeListener: OnKeyEventPreImeListener? = null
    
        override fun dispatchKeyEventPreIme(event: KeyEvent?): Boolean {
            onKeyEventPreImeListener?.onPreImeKeyEvent()
            return false
        }
    }
    

    监听器如下所示:

    interface OnKeyEventPreImeListener {
    
        fun onPreImeKeyEvent()
    }
    

    我将它设置在 Fragment 中以隐藏我的搜索行:

    search_input.onKeyEventPreImeListener = object: OnKeyEventPreImeListener {
        override fun onPreImeKeyEvent() {
            hideSearchRow()
        }
    }
    

    请注意,dispatchKeyEventPreIme(...) 方法被调用了两次,因此请确保您不要在事件中对您的工作人员执行两次。

    【讨论】:

      【解决方案5】:

      最后,我可以通过以下 3 个步骤做到这一点:

      1.创建自定义 EditText 类来处理 Back Press:

      public class CustomEditTextWithBackPressEvent extends androidx.appcompat.widget.AppCompatEditText {
      
          private MyEditTextListener onBackPressListener;
      
          public CustomEditTextWithBackPressEvent(Context context, AttributeSet attrs) {
              super(context, attrs);
          }
      
          public void setOnBackPressListener(MyEditTextListener onBackPressListener) {
              this.onBackPressListener = onBackPressListener;
          }
      
          @Override
          public boolean onKeyPreIme(int keyCode, KeyEvent event) {
              if (keyCode == KeyEvent.KEYCODE_BACK &&
                  event.getAction() == KeyEvent.ACTION_UP) {
                  //back button pressed
                  if (Objects.requireNonNull(ViewCompat.getRootWindowInsets(getRootView())).isVisible(WindowInsetsCompat.Type.ime())) {
                  //keyboard is open
                      onBackPressListener.callback();
                  }
                  return false;
              }
              return super.dispatchKeyEvent(event);
          }
      
          public interface MyEditTextListener {
              void callback();
          }
      }
      

      2。用 XML 中的 CustomEditTextWithBackPressEvent 替换您的普通 EditText

      <CustomEditTextWithBackPressEvent
          android:id="@+id/etSearch"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:hint="@string/search_hint"
          android:imeOptions="actionSearch"
          android:inputType="text"
          android:maxLines="1" />
      

      3.处理后按:

      binding.etSearch.setOnBackPressListener(() -> {
          //handle back press when keyboard is open
      });
      

      【讨论】:

        猜你喜欢
        • 2011-04-21
        • 1970-01-01
        • 2011-06-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多