Android 系统使用蓝牙遥控器的确定键无法调起输入法问题解决方案

测试反馈Android蓝牙遥控器适配问题:瞩目应用中,点击加入会议,使用遥控器点击返回键收起输入法键盘,再点击会议名称栏无法调出输入法键盘。此问题在Android 6.0必现。

经查看分析,应用使用了AutoCompleteTextView控件,此控件自动添加了onclicklistener监听事件。
AutoCompleteTextView继承了EditText,EditText的父类是TextView。蓝牙遥控器的确定按键对应的Android keycode事件是KeyEvent.KEYCODE_DPAD_CENTER。之后查看TextView类得知,Android 6.0系统在设有onclicklistener监听的输入框时,遥控器确定键按下默认不调起输入法。

所以只需修改TextView类的onKeyUp方法,在收到KEYCODE_DPAD_CENTER时,放开hasonClickListener判断,即可直接调起输入法。
文件位置: /frameworks/base/core/java/android/widget/TextView.java
修改如下:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (!isEnabled()) {
    return super.onKeyUp(keyCode, event);
}

if (!KeyEvent.isModifierKey(keyCode)) {
    mPreventDefaultMovement = false;
}

switch (keyCode) {
    case KeyEvent.KEYCODE_DPAD_CENTER:
        if (event.hasNoModifiers()) {
            /*
             * If there is a click listener, just call through to
             * super, which will invoke it.
             *
             * If there isn't a click listener, try to show the soft
             * input method.  (It will also
             * call performClick(), but that won't do anything in
             * this case.)
             */
            ////add by pengtg for ROM begin.
            //if (!hasOnClickListeners()) {
                if (mMovement != null && mText instanceof Editable
                        && mLayout != null && onCheckIsTextEditor()) {
                    InputMethodManager imm = InputMethodManager.peekInstance();
                    viewClicked(imm);
                    if (imm != null && getShowSoftInputOnFocus()) {
                        imm.showSoftInput(this, 0);
                    }
                }
            //}
            ////add by pengtg for ROM end.
        }
        return super.onKeyUp(keyCode, event);
        ......
    }
    ......
}

你可能感兴趣的:(Android,Android,遥控器,输入法,按键事件)