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.跳过


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

inputtype 代码对应表

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

Android控件EditText的属性InputType的一些经验及动态设置TYPE_NUMBER_FLAG_DECIMAL无效的原因

1、InputType属性在代码中的设置必须放在setSingleLine()函数之后,否则无效; 2、关于InputType属性xml与代码的对应值如下: android java代...
  • atm008
  • atm008
  • 2016年04月12日 17:01
  • 4085

android:inputType常用取值

android中inputType属性在EditText输入值时启动的虚拟键盘的风格有着重要的作用。这也大大的方便的操作。有时需要虚拟键盘只为字符或只为数字。所以inputType尤为重要。andro...
  • xqf222
  • xqf222
  • 2013年08月06日 11:32
  • 63775

LatinIME输入法分析

输入法的设置在res/xml/method.xml的标签中,主要设置两个属性:android:settingsActivity,输入法的设置程序入口。android:isDefault,这个输入法是不...
  • a345017062
  • a345017062
  • 2011年01月12日 08:49
  • 14564

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

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

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

LatinIME源码地址:https://Android.googlesource.com/platform/packages/inputmethods/LatinIME/+/android-5.1....
  • asasasdasfaf
  • asasasdasfaf
  • 2016年12月19日 17:28
  • 1151

LatinIME键盘绘制(一)

LatinIME中键盘布局文件解析与绘制流程
  • dcsff
  • dcsff
  • 2015年07月28日 15:45
  • 1311

在Android原生输入法LatinIME中添加自定义按键

由于项目需求,需要修改android系统原生输入法。以下修改的是源码中的LatinIME/java工程。 示例添加的是隐藏软键盘的按键,具体的该在哪个位置添加,进入到相应的文件就明白了。 A.将h...
  • u011247387
  • u011247387
  • 2015年07月02日 15:25
  • 1469

LatinIME切换语言

LatinIME语言切换的大致步骤
  • dcsff
  • dcsff
  • 2015年07月27日 12:32
  • 1391

LatinIME输入法的一些总结

1.关于输入法的一些设置重要文件 res/xml/method.xml 在该文件中在前面的博客http://blog.csdn.net/holdrise/article/details/879...
  • holdrise
  • holdrise
  • 2013年04月15日 11:53
  • 1773
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android AOSP输入法(LatinIME)大写判断分析
举报原因:
原因补充:

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