Android : 当为 EditText 打开键盘时处理后退按钮点击

Android : Handle back button click when keyboard is open for EditText

当我在 EdiText 中写东西并按下后退按钮时,它隐藏了键盘,这是完美的。但是当键盘为 EditText 打开时,我想处理这个后退按钮单击。原因是我想在键盘打开时按下后退按钮时清除EditText的文本。

Activity 方法 onBackPressed() 在为 EditText 打开键盘时不调用。

我检查了 here 但没有帮助。

如有任何帮助,我们将不胜感激。

您可以使用自定义 edittext 并实现 onKeyPreIme 来监听 onbackPressed

public class MyEditText extends androidx.appcompat.widget.AppCompatEditText {

    private MyEditTextListener listener;

    public interface MyEditTextListener {
        void callback();
    }

    public void setListener(MyEditTextListener listener) {
        this.listener = listener;
    }

    public MyEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onKeyPreIme(int keyCode, KeyEvent event) {

        listener.callback();
        return true;
    }
}

activity

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        MyEditText myEditText = findViewById(R.id.myEditText);
        myEditText.setListener(new MyEditText.MyEditTextListener() {

            @Override
            public void callback() {
                //handle backPressed event when keyboard have shown
            }
        });
    }

我对@GuanHongHuang的回答做了一些修改,现在我可以通过这3个步骤来完成:

1.创建自定义 EditText Class 以处理返回按:

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 click
        //your code here
    });