Android-设置-实体键盘-使用屏幕键盘-默认打开

设置-实体键盘-使用屏幕键盘-默认打开

提示:Android-设置-实体键盘-使用屏幕键盘-默认打开

文章目录


前言-需求-场景

使用场景:

使用USB外接键盘 可能实际到兼容性问题、功能、符号补充等;使用遥控器场景,肯定需要软键盘的

需求:默认打开使用屏幕键盘功能

一、参考资料

Android 13 默认打开 使用屏幕键盘
MT8390 Android12 默认使用软键盘
Android 13 默认打开 使用屏幕键盘
AOSP ~ 默认属性值

以前属性相关笔记:
Android 系统属性添加篇
Framework 层Settings.System, Settings.Secure和Settings.Global存储及应用

二、修改文件

以MTK 平台为例,修改文件路径: /vendor/mediatek/proprietary/packages/apps/SettingsProvider/res/values/defaults.xml

三、实现方案

属性:def_show_ime_with_hard_keyboard 设置为ture

java 复制代码
    <!-- Default for Settings.Secure.SHOW_IME_WITH_HARD_KEYBOARD -->
    <bool name="def_show_ime_with_hard_keyboard">true</bool>

四、源码解读

1、实体键盘页面-PhysicalKeyboardFragment

常规方法,进入实体键盘,查看日志打印:

2、实体键盘页面布局-physical_keyboard_settings

查看 布局文件,如下:

3、再次分析界面-PhysicalKeyboardFragment

所以最终的开关UI是 mShowVirtualKeyboardSwitch

设置监听-mShowVirtualKeyboardSwitchPreferenceChangeListener

java 复制代码
 @Override
    public void onResume() {
        super.onResume();
        mLastHardKeyboards.clear();
        scheduleUpdateHardKeyboards();
        mIm.registerInputDeviceListener(this, null);
        mShowVirtualKeyboardSwitch.setOnPreferenceChangeListener(
                mShowVirtualKeyboardSwitchPreferenceChangeListener);
        registerShowVirtualKeyboardSettingsObserver();
    }

监听中根据系统属性设置开关状态-SHOW_IME_WITH_HARD_KEYBOARD

java 复制代码
   //设置属性值
    private final OnPreferenceChangeListener mShowVirtualKeyboardSwitchPreferenceChangeListener =
            (preference, newValue) -> {
                Secure.putInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD,
                        ((Boolean) newValue) ? 1 : 0);
                return true;
            };

// 监听属性值并更新开关UI状态
    private final ContentObserver mContentObserver = new ContentObserver(new Handler(true)) {
        @Override
        public void onChange(boolean selfChange) {
            updateShowVirtualKeyboardSwitch();
        }
    };

更新UI组件开关状态-根据属性-updateShowVirtualKeyboardSwitch

java 复制代码
  private void updateShowVirtualKeyboardSwitch() {
        mShowVirtualKeyboardSwitch.setChecked(
                Secure.getInt(getContentResolver(), Secure.SHOW_IME_WITH_HARD_KEYBOARD, 0) != 0);
    }

4、属性值-Secure.SHOW_IME_WITH_HARD_KEYBOARD

既然已经分析到了属性值,那么属性Secure.SHOW_IME_WITH_HARD_KEYBOARD 到底是什么,搞清楚了就去默认一个属性值不就可以了嘛。

这里 : 借鉴以前的资料 笔记:Framework 层Settings.System, Settings.Secure和Settings.Global存储及应用,查找实际值:

五、开启、关闭 屏幕键盘核心区别和适用场景:

下面的对比表格清晰地展示了两者的核心区别和适用场景:

特性 开启屏幕键盘 (与实体键盘共存) 关闭屏幕键盘 (仅用实体键盘)
核心作用 作为实体键盘的功能补充和应急备用 获得纯粹、高效的实体键盘输入体验
输入方式 实体键盘 + 触摸/点击屏幕键盘 仅通过实体键盘
最佳使用场景 1. 输入表情符号、颜文字、特殊符号 ;2. 使用滑动输入、语音输入 ;3. 实体键盘临时兼容性问题;4. 快速切换多语言 1. 长时间文字工作(写作、编程);2. 需要完整屏幕视野(阅读、编辑);3. 连接游戏手柄等外设时避免遮挡
优点 功能全面,兼顾效率与灵活 界面干净,无遮挡,专注度高,误触少
缺点 屏幕底部被占用,可能误触 无法使用触摸输入特有的便捷功能

总结

  • 这其实就是一个简单的设置 相关的功能默认需求
  • 还是建议从源码角度来看更改,了解、熟悉源码、把流程走一遍会有一定的收获,后续研发写代码也会有一定的经验参考
  • 多总结、多学习,和前面知识点形成闭环吧