Android AOSP输入法(LatinIME)大写判断分析

原创 2015年07月09日 15:13:57

LatinIME源码地址:https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/android-5.1.1_r6

一、大写模式:

Android中字母大写有三种模式:textCapCharacters、textCapWords、textCapSentences,分别对应全大写、单词首字母大写、句子首字母大写,这三种模式在InputType中的定义分别是TYPE_TEXT_FLAG_CAP_CHARACTERS、TYPE_TEXT_FLAG_CAP_WORDS、TYPE_TEXT_FLAG_CAP_SENTENCES。而InputType中定义的这三个值又分别对应TextUtils中定义的CAP_MODE_CHARACTERS、CAP_MODE_WORDS、CAP_MODE_SENTENCES。而LatinIME判断大写模式时用的值是TextUtils定义的这三个值。

对应关系:

1.全字母大写:textCapCharacters(android:inputType) == TYPE_TEXT_FLAG_CAP_CHARACTERS(InputType)== CAP_MODE_CHARACTERS(TextUtils)

2.单词首字母大写:textCapWords(android:inputType) == TYPE_TEXT_FLAG_CAP_WORDS(InputType)== CAP_MODE_WORDS(TextUtils)

3.句子首字母大写:textCapSentences(android:inputType) == TYPE_TEXT_FLAG_CAP_SENTENCES(InputType) == CAP_MODE_SENTENCES(TextUtils)


二、核心方法分析:

1.判断大小写的入口函数是RichInutConnection中的getCursorCapsMode方法

public int getCursorCapsMode(final int inputType, final SpacingAndPunctuations spacingAndPunctuations, final boolean hasSpaceBefore) {
        mIC = mParent.getCurrentInputConnection();
        if (null == mIC)
            return Constants.TextUtils.CAP_MODE_OFF;
        if (!TextUtils.isEmpty(mComposingText)) {
            if (hasSpaceBefore) {
                // If we have some composing text and a space before, then we should have
                // MODE_CHARACTERS and MODE_WORDS on.
                return (TextUtils.CAP_MODE_CHARACTERS | TextUtils.CAP_MODE_WORDS) & inputType;
            } else {
                // We have some composing text - we should be in MODE_CHARACTERS only.
                return TextUtils.CAP_MODE_CHARACTERS & inputType;
            }
        }
        // TODO: this will generally work, but there may be cases where the buffer contains SOME
        // information but not enough to determine the caps mode accurately. This may happen after
        // heavy pressing of delete, for example DEFAULT_TEXT_CACHE_SIZE - 5 times or so.
        // getCapsMode should be updated to be able to return a "not enough info" result so that
        // we can get more context only when needed.
        if (TextUtils.isEmpty(mCommittedTextBeforeComposingText) && 0 != mExpectedSelStart) {
            if (!reloadTextCache()) {
                Log.w(TAG, "Unable to connect to the editor. " + "Setting caps mode without knowing text.");
            }
        }
        // This never calls InputConnection#getCapsMode - in fact, it's a static method that
        // never blocks or initiates IPC.
        return CapsModeUtils.getCapsMode(mCommittedTextBeforeComposingText, inputType, spacingAndPunctuations, hasSpaceBefore);
    }
首先判断当前是不是处于候选词状态,这种情况下,会去判断再次输入的字符前是不是有空格,如果有空格就需要判断EditText的属性是不是设置全字符大写(CAP_MODE_CHARACTERS)和单词首字母大写(CAP_MODE_WORDS);如果没有空格,就只需要判断属性是不是全字符大写就可以了。

如果当前不是候选词状态,那么就需要调用CapsModeUtils.getCapsMode方法来判断单词大小写情况。

2.核心方法:CapsModeUtils.getCapsMode,

    1.参数:它包含四个参数,分别是:

    1) CharSequence cs:需要检查大写模式的文本(getCursorCapsMode传入的参数是之前提前的内容

    2) int reqModes:调用输入法的控件所设置的大写模式

    3) SpacingAndPunctuations:当前空格、符合的设置

    4) hasSpaceBefore:判断是否需要考虑cs后面插入的空格

    2.返回值:返回当前位置实际的大写模式

3.分析:getCapsMode分三步来检查大写模式:

    1.如果调用输入法的控件设置的是全字母大写,那么就可以直接返回TextUtils.CAP_MODE_CHARACTERS        

        // Step 1 : check for cap MODE_CHARACTERS. If it's looked for, it's always on.
        if ((reqModes & (TextUtils.CAP_MODE_WORDS | TextUtils.CAP_MODE_SENTENCES)) == 0) {
            // Here we are not looking for MODE_WORDS or MODE_SENTENCES, so since we already
            // evaluated MODE_CHARACTERS, we can return.
            return TextUtils.CAP_MODE_CHARACTERS & reqModes;
        }

    2.跳过


版权声明:本文为原创文章,转载请注明出处。

相关文章推荐

LatinIME输入法分析

输入法的设置在res/xml/method.xml的标签中,主要设置两个属性:android:settingsActivity,输入法的设置程序入口。android:isDefault,这个输入法是不...

LatinIME中几个主要方法说明

LatinIME源码地址:https://android.googlesource.com/platform/packages/inputmethods/LatinIME/+/android-5.1....
  • dcsff
  • dcsff
  • 2015年07月20日 14:51
  • 2659

Android源代码结构分析

Android源代码结构分析 Google提供的Android包含了:Android源代码,工具链,基础C库,仿真环境,开发环境等,完整的一套。 第一级别的目录和文件如下所示: ...

Android AOSP输入法(LatinIME)输入流程二

一、起始: LatinIME字符输入的初始方法是LatinIME类中的onCodeInput方法: // Implementation of {@link KeyboardActionListene...
  • dcsff
  • dcsff
  • 2015年07月13日 21:06
  • 2417

android默认的设置修改

packages/inputmethods/LatinIME/java/res/xml/method.xml 泰语:                 android:label="@string/s...
  • BENKG
  • BENKG
  • 2017年07月27日 17:01
  • 163

Android framework系统默认设置修改

转载请注明出处:http://blog.csdn.net/tiantian715/ Launcher 总结:   1、launcher的布局太居中,要想两边拉伸     apps_...

Android 如何调节LatinIME键盘上的字体大小

前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net       ...
  • luckkof
  • luckkof
  • 2014年01月23日 10:15
  • 1302

Android系统内置第三方输入法

Android系统内置第三方输入法

inputtype 代码对应表

inputtype  代码对应表 Constant Value Description none 0x00000000 There is no content ...
  • wmumu_
  • wmumu_
  • 2016年06月13日 23:14
  • 534

LatinIME中几个主要方法说明======》修改按键背景,以及行列间距

LatinIME源码地址:https://Android.googlesource.com/platform/packages/inputmethods/LatinIME/+/android-5.1....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android AOSP输入法(LatinIME)大写判断分析
举报原因:
原因补充:

(最多只允许输入30个字)