皮皮网
皮皮网

【微信充值游戏源码】【ligerui源码】【netfilter源码】ime编程源码_m+编程 开源

时间:2024-12-27 17:14:08 来源:hacd源码

1.MTK平台如何修改默认输入法
2.Android焦点移动requestFocus 源码分析一

ime编程源码_m+编程 开源

MTK平台如何修改默认输入法

       如何修改默认输入法?

       一、编编程适用于ICS(AndroidV4.0)之前的程源版本:

       1.安装需要用的默认输入法(.apk)到system/app

       2.修改文件frameworks/base/packages/SettingsProvider/res/values/defaults.xml

       <string name="default_input_method" translatable="false">默认输入法 ID

       </string>

       红色标记表示输入法 ID, 比如 PinyinIME 为: com.android.inputmethod.pinyin/.PinyinIME

       二、开源适用于ICS、编编程JB、程源JB2、开源微信充值游戏源码KK的编编程版本:

       1.需要提前将用到的默认输入法(.apk)内置到系统中( 请参考如何将APK预置进系统)

       2.修改文件mediatek/config/${ Project}/ProjectConfig.mk

       将宏DEFAULT_INPUT_METHOD的值设置为所需的输入法;

       比如PinyinIME, 则设为:

       DEFAULT_INPUT_METHOD=com.android.inputmethod.pinyin.PinyinIME

       这个值是程源输入法源码中,包含InputMethodService子类的开源那个包名.实现InputMethodService的子类的类名。这里比log中打印的编编程完整类名少一个"/",请注意

       补充说明:

       KK的版本不需要一下修改:

       上面的修改方法只适用于默认输入法为com.android.inputmethod.pinyin/.PinyinIME这种格式的输入

       法(即反斜杠后面就是类名的情况),对于com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME (即反斜杠后面是程源完整类名的情况),这种情况是开源不支持修改mediatek/config/${ Project}/ProjectConfig.mk里面DEFAULT_INPUT_METHOD的方法来设置默认输入法的。

       以com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME 为例

       请改用下面的编编程方法修改,在SettingsProvider 的程源DatabaseHelper.java中

       有

       Log.i(TAG, "defaultIME : " + defaultIME);

       if (defaultIME != null) {

       StringBuffer strBuffer = new StringBuffer(defaultIME);

       int lastDotPos = defaultIME.lastIndexOf(".");

       String strInsert = "/";

       strBuffer.insert(lastDotPos, strInsert);

       loadSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,

       strBuffer.toString());

       } else {

       Log.i(TAG, "default IME from IMEFeatureOption is null!!");

       }

       请将默认的初始化部分code删除, 即将 下面的开源code都删除掉。

       Log.i(TAG, "defaultIME : " + defaultIME);

       if (defaultIME != null) {

       StringBuffer strBuffer = new StringBuffer(defaultIME);

       int lastDotPos = defaultIME.lastIndexOf(".");

       String strInsert = "/";

       strBuffer.insert(lastDotPos, strInsert);

       loadSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,

       strBuffer.toString());

       } else {

       Log.i(TAG, "default IME from IMEFeatureOption is null!!");

       }

       然后在删除的后面添加

       loadSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,

       "com.google.android.inputmethod.latin/com.android.inputmethod.latin.LatinIME");//这里修改默认选中的输入法

       三、适用于L, M的版本

       请在APK正确预置的前提下,再修改如下:

       在InputMethodManagerService的systemRunning()函数, if (!mImeSelectedOnBoot) 的分支中修改如下

       if (!mImeSelectedOnBoot) {

       Slog.w(TAG, "Reset the default IME as \"Resource\" is ready here.");

       // String preInstalledImeName = SystemProperties.get("ro.mtk_default_ime");

       String preInstalledImeName = "第三方输入法的完整包名ID";

       或者直接修改build.prog中的ro.mtk_default_ime属性值,也可在system.prog中增加此属性值。ligerui源码只要修改完后, adb shell getprop ro.mtk_default_ime能获取到正确的预置输入法ID即可。

       MTK平台如何修改默认输入法如果按照如上的步骤没有修改成功,请参考如下步骤进行检查修改:

       (1)检查是否成功预置输入法:FAQ

       (2)检查下setting-- language&input 界面,该输入法前面的勾是否选上,没有选上说明此输入法没有被enable,请参考FAQ来enable;

       (3)检查是否发生语言切换,如果有切换则会恢复默认输入法,若不想因语言变化导致恢复,请参考FAQ,netfilter源码FAQ

       (4)修改默认输入法FAQ

       这个解决方法是在闯客技术论坛转的,如果解决不了你可以去提问。

Android焦点移动requestFocus 源码分析一

       本文从源码角度深入分析了Android设备中焦点移动和点击触发机制。当用户点击上下左右按键时,UI会显示底部阴影,而点击Enter键则触发对应View的点击事件。这整个过程主要涉及到的方向按键处理、普通按键分发流程以及系统功能按键处理。

       点击方向按键的事件首先由InputMethodManager$ImeInputEventSender接收,然后交由ViewRootImpl处理。crontab 源码ViewRootImpl通过一系列State的链式调用,最终在ViewGroup的requestFocus方法中被调用,最终调用View的requestFocus方法。值得注意的是,按键事件是从输入法(ImeInputEventSender是用于接收输入法按键事件的应用组件)传递的,而非ViewRootImpl直接处理。

       普通按键的分发流程中,ViewRootImpl的WindowInputEventReceiver可以接收到键盘输入事件,然后分发给View.dispatchKeyEvent,最后可能触发Activity的write 源码onKeyDown与onKeyUp方法。然而,系统会直接处理大部分功能按键(如亮度调节、音量键、媒体按键等),而不会将它们分发给View进行处理。

       系统功能按键处理在InputMethodManager中定义,这部分会先将按键事件传递给输入法进行处理,然后将结果传给与输入法绑定的window。InputMethodManager中的mCallback实现类是ViewRootImpl$ImeInputStage,如果handled为true表示输入法已经处理过事件,否则会进入ViewRootImpl的finish或forward方法。

       View的焦点移动主要通过View.requestFocus和requestFocusNoSearch方法实现。无论通过按键还是手动调用方法,流程都会最终指向requestFocusNoSearch,进一步处理焦点获取和释放逻辑。ViewGroup重写了handleFocusGainInternal方法来处理焦点获得的内部流程,首先清理当前ViewGroup的mFocused标记,然后调用super.handleFocusGainInternal方法。通过层层递归,整个View树会更新完成焦点状态,并通知OnFocusChangeListener监听方法,更新背景状态以突出焦点View。

       descendantFocusability标记位在ViewGroup中起着决定性作用,它定义了ViewGroup对子View焦点的处理方式,有三种行为。当ViewGroup的一个子View获取焦点时,该ViewGroup本身并不会获得焦点,只有子View的mPrivateFlags标记位被赋值为PFLAG_FOCUSED时,才表明获取了焦点。isFocused与hasFocus不同,isFocused用于判断当前View是否具有焦点。

       当需要查询当前获取到焦点的View时,可以使用findFocus方法。该方法在View类中定义,而在ViewGroup类中重写了它,实现逻辑简单,主要检查当前ViewGroup的mPrivateFlags标记位是否包含PFLAG_FOCUSED,若包含则返回当前View,否则返回null。

       综上所述,本文从源码角度详细解析了Android设备中焦点移动和点击事件触发的实现机制,包括按键事件的处理流程、View的焦点获取与释放机制以及descendantFocusability标记位的作用。

更多内容请点击【知识】专栏