有客户反馈说,3128插入物理键盘后,输入时软键盘仍然弹出来。
测试测了一下果然是这样,一开始还以为前任码农改出来的问题,试了一下最新sdk,仍然如此
卧槽。。。然后上网搜,从来都是要求搞强制弹出的,这下子麻爪,按照
Android P控制虚拟键盘的显示和隐藏_android开发 虚拟键盘开关_Eastsea.Chen的博客-优快云博客
的改法,辛苦摸索出来隐藏的代码是
lzy@ztlsz-PowerEdge-T640:/media/lzywork/rk3128_nougat_mid$ git diff frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
diff --git a/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java b/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
index 2e9cbf2..a25c383 100644
--- a/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/frameworks/base/core/java/android/view/inputmethod/InputMethodManager.java
@@ -67,6 +67,7 @@ import java.util.Map;
import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import android.provider.Settings;
import static android.Manifest.permission.WRITE_SECURE_SETTINGS;
@@ -914,7 +915,10 @@ public final class InputMethodManager {
* @param flags Provides additional operating flags. Currently may be
* 0 or have the {@link #SHOW_IMPLICIT} bit set.
*/
- public boolean showSoftInput(View view, int flags) {
+ public boolean showSoftInput(View view, int flags) {//luke fix 实体键盘时仍然显示虚拟键盘的bug。现在按设置-输入-实体键盘的值来
+ //int ret = Settings.Secure.getInt(view.getContext().getContentResolver(), Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0);
+ //if( ret == 0) return false;
+ //else return showSoftInput(view, flags, null);
return showSoftInput(view, flags, null);
}
好了 ,这下子永久隐藏,不插软键盘也隐藏。我都想给这客户直接这么出算了。后来一想,算了还是正经修bug吧。于是加调试信息看现象,最后,补丁如下
lzy@ztlsz-PowerEdge-T640:/media/lzywork/rk3128_nougat_mid$ git diff frameworks/base/core/java/android/inputmethodservice/InputMethodService.java
diff --git a/frameworks/base/core/java/android/inputmethodservice/InputMethodService.java b/frameworks/base/core/java/android/inputmethodservice/InputMethodService.java
index 9a6f804..898c55d 100644
--- a/frameworks/base/core/java/android/inputmethodservice/InputMethodService.java
+++ b/frameworks/base/core/java/android/inputmethodservice/InputMethodService.java
@@ -1271,7 +1271,12 @@ public class InputMethodService extends AbstractInputMethodService {
if (mSettingsObserver.shouldShowImeWithHardKeyboard()) {
return true;
}
+
+ //luke fix 插入键盘且设置-输入法-实体键盘显示虚拟键未打开时,虚拟键仍显示的问题
Configuration config = getResources().getConfiguration();
+ if( config.keyboard == Configuration.KEYBOARD_QWERTY &&config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES )
+ return false;
+
return config.keyboard == Configuration.KEYBOARD_NOKEYS
|| config.hardKeyboardHidden == Configuration.HARDKEYBOARDHIDDEN_YES;
}
经本人亲自测试:设置-输入法-物理键盘-显示XXX虚拟键盘的开关现在有用了。
该开关实际修改的值是:
adb shell settings put secure show_ime_with_hard_keyboard 1
adb shell settings get secure show_ime_with_hard_keyboard
代码写法是:
Settings.Secure.putInt(this.getContentResolver(),Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0); Settings.Secure.getInt(this.getContentResolver(),Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0);