代码之家  ›  专栏  ›  技术社区  ›  sagar suri

无法在emulator中检测到软键盘的删除按钮

  •  1
  • sagar suri  · 技术社区  · 7 年前

    我正在尝试使用以下方法检测软键盘的后退或删除按钮。它在物理设备中工作良好,但不工作 emulator 。Emulator能够检测除delete按钮之外的所有关键事件(如enter按钮、number按钮)。在emulator中按delete按钮时 onKeyDown() 也没有 dispatchKeyEvent() 被调用。有什么问题吗?

    执行此操作的目的:

    我正在尝试导航到上一个 EditText 如果用户在当前空白字段上按delete键,则为字段 编辑文本 领域这就是为什么我要依赖 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 回复  |  直到 7 年前
        1
  •  3
  •   Vikasdeep Singh    7 年前

    了解您的要求后,我发现 onKeyDown onKeyUp 正在处理 Nexus 5 API 25 emulator但是TextWatcher可以满足您的需要,如果您真的想使用 Nexus 5 API 25 模拟器。

    在…上 Nexus 5X API 26 ,则, onKeyDown onKeyUp 工作正常。当然 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() 在emulator上也可以正常工作。我正在使用以下代码:

    //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 emulator