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
});
当我在 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
});