【问题标题】:Android : Handle back button click when keyboard is open for EditTextAndroid:为EditText打开键盘时处理后退按钮单击
【发布时间】:2022-01-07 00:21:24
【问题描述】:

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

为 EditText 打开键盘时不会调用活动方法onBackPressed()

我检查了here,但没有帮助。

任何帮助将不胜感激。

【问题讨论】:

  • 清除背面文字不是用户期望的行为。你不应该这样做。添加“清除”按钮,但不要将“返回”用于非“返回”的操作。
  • @Agent_L 不要专注于 UI/UX,如果您知道在键盘打开时处理后退按钮单击,请告诉我!
  • 为什么不自定义视图示例:在视图旁边添加一个带有清晰图像的 ImageView。
  • @yansam 清除按钮已经存在。需要返回按钮来处理。

标签: android android-edittext android-softkeyboard back-button


【解决方案1】:

你可以使用自定义edittext并实现onKeyPreIme来监听backPressed

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;
    }
}

活动

    @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
            }
        });
    }

【讨论】:

  • 这个自定义编辑文本如何与活动一起使用?比如如何在活动/片段中使用 onKeyPreIme 方法?
  • @KishanSolanki 我编辑我的答案你可以试试。
  • 2 件事。 1. 活动的方法 onBackPressed() 一旦你专注于编辑文本就不会再次调用。 2.callback()方法调用了两次
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-13
    • 2020-06-19
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多