无法在仿真器中检测到软键盘的删除按钮

时间:2018-05-03 07:13:55

标签: android android-emulator

我正在尝试使用以下方法检测返回或删除软键盘的按钮。它在物理设备中完美运行但不起作用emulator。模拟器能够检测所有关键事件(如输入按钮,数字按钮)预期删除按钮。在模拟器中按下删除按钮时,不会调用onKeyDown()dispatchKeyEvent()。可能是什么问题?

这样做的目的:

如果用户在当前空EditText字段上按下删除,我会尝试导航到之前的EditText字段。这就是我依赖dispatchKeyEvent()方法的原因。

我正在使用 Nexus 5X API 25模拟器

public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_DEL) {
            Log.e(TAG,keyCode)
        }
        return super.onKeyDown(keyCode, event);
    }

这是我的布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusable="true"
        android:hint="Name" />

</RelativeLayout>

删除按钮的图像:

enter image description here

1 个答案:

答案 0 :(得分:2)

在了解了您的要求后,我发现onKeyDownonKeyUp无法在Nexus 5 API 25模拟器上运行,但如果您真的想使用Nexus 5 API 25模拟器,TextWatcher可以满足您的需求。

Nexus 5X API 26onKeyDownonKeyUp工作正常。当然TextWatcher也在运作。

使用TextWatcher检测EditText内的文本更改,然后您可以检查按下了哪个键。以下是工作代码:

    TextWatcher textWatcher = new TextWatcher() {

        public void  beforeTextChanged(CharSequence s, int start, int count, int after){
            if (after < count) {
                Log.d("DELETE_KEY_PRESSED", "beforeTextChanged: ");
            }
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (s.length()>0 && s.subSequence(s.length()-1, s.length()).toString().equalsIgnoreCase("\n")) {
                Log.d("ENTER_KEY_PRESSED", "onTextChanged: ");
            } else if (s.length() == 0) {
                Log.d("DELETE_KEY_PRESSED", "onTextChanged: ");
            }
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    };

    EditText editText = (EditText) findViewById(R.id.edit);
    editText.addTextChangedListener(textWatcher);

您也可以使用TextWatcher检测所有其他按键。

顺便说一句,对我来说,onKeyDown()onKeyUp()在模拟器上也能正常运行。我使用下面的代码:

//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL) {
        Log.d("KEY_PRESSED - onKeyDown", "KEYCODE_DEL");
    }
    return super.onKeyDown(keyCode, event);
}

//To detect DELETE KEY PRESS event there is no text in EditText
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_DEL) {
        Log.d("KEY_PRESSED - onKeyUp", "KEYCODE_DEL");
    }
    return super.onKeyUp(keyCode, event);
}

注意:我使用的是Nexus 5X API 26模拟器