【发布时间】:2011-07-04 01:28:57
【问题描述】:
如何处理在 EditText 上键入时按返回键的事件?当显示虚拟键盘并且用户按回时,它会被隐藏。我想处理这个事件,但是在 EditText 中设置 OnKeyListener 并没有帮助。
【问题讨论】:
-
以下答案现在都不起作用,有没有更新的方法?
标签: android listener android-edittext
如何处理在 EditText 上键入时按返回键的事件?当显示虚拟键盘并且用户按回时,它会被隐藏。我想处理这个事件,但是在 EditText 中设置 OnKeyListener 并没有帮助。
【问题讨论】:
标签: android listener android-edittext
谢谢雷诺。它可能似乎有效,但我设法以不同的方式解决它。
我覆盖了 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);
}
【讨论】:
onKeyPreIme 方法。然后,在您的 xml 中,您需要使用 com.your.package.CustomEditText 而不是使用EditText。见这里:stackoverflow.com/a/28719420/1421014
这不起作用?
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 我遇到了。我希望它也对你有用。
【讨论】:
我不知道为什么会这样,但是如果您只是在自定义 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);
}
【讨论】:
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(...) 方法被调用了两次,因此请确保您不要在事件中对您的工作人员执行两次。
【讨论】:
最后,我可以通过以下 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
});
【讨论】: