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

Posted

技术标签:

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

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

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

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

任何帮助将不胜感激。

【问题讨论】:

清除背面文字不是用户期望的行为。你不应该这样做。添加“清除”按钮,但不要将“返回”用于非“返回”的操作。 @Agent_L 不要专注于 UI/UX,如果您知道在键盘打开时处理后退按钮单击,请告诉我! 为什么不自定义视图示例:在视图旁边添加一个带有清晰图像的 ImageView。 @yansam 清除按钮已经存在。需要返回按钮来处理。 【参考方案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_
    android:layout_
    android:hint="@string/search_hint"
    android:imeOptions="actionSearch"
    android:inputType="text"
    android:maxLines="1" />

3.处理后按:

binding.etSearch.setOnBackPressListener(() -> 
        //handle click
        //your code here
    );

【讨论】:

以上是关于Android:为EditText打开键盘时处理后退按钮单击的主要内容,如果未能解决你的问题,请参考以下文章

android edittext 在键盘打开时变得部分可见

Android EditText软键盘问题

Android EditText 禁止自动弹出键盘

Android打开某个activity时自动弹出输入法键盘

Android键盘在Page Renderer中失去了对触摸的关注

是否可以在文本键盘之前打开数字键盘?