精华内容
下载资源
问答
  • Android输入法文档

    2014-05-19 11:38:37
    Android输入法文档
  • win7中word文档输入法不灵了怎么办.docx
  • MTK输入法技术文档

    2010-07-25 12:56:13
    MTK输入法技术文档 MTK输入法技术文档 MTK输入法技术文档
  • 行业文档-设计装置-种手写输入法的界面分布方法及输入法.zip
  • 行业文档-设计装置-种五笔输入法教学系统
  • 这是我近来开发输入法所参考的文档资料,个人感觉很适合喜欢研究输入法的初学开发者!
  • 行业文档-设计装置-汉语拼音输入法
  • 区位输入法文档

    2011-11-23 18:42:51
    区位输入法文档
  • FIT中文输入法PPT文档

    2014-01-23 16:14:14
    FIT中文输入法PPT文档,基于IOS开发平台
  • 实现个Android输入法

    千次阅读 2017-03-28 22:58:12
    Android提供了个可扩展的输入法框架,允许应用为用户提供不同的输入法,比如触屏键盘甚至语音输入。只要安装,用户就可以从系统设置中选择自己喜欢使用的输入法,并且在整个系统环境中使用;在同一时刻,只有种...

    原文来自 Android Developer Guide,本文为原文翻译,如有错误,欢迎指出。

    输入法(IME:Input method editor)是一个能够让用户输入文本的工具。Android提供了一个可扩展的输入法框架,允许应用为用户提供不同的输入法,比如触屏键盘甚至语音输入。只要安装,用户就可以从系统设置中选择自己喜欢使用的输入法,并且在整个系统环境中使用;在同一时刻,只有一种输入法可以使用。

    要在Android系统中创建一个输入法,你创建的应用需要包含继承自 InputMethodService的类。此外,通常还要创建一个”settings”的activity,用来向IME服务传递参数选项。你也可以自定义设置界面,把它作为系统设置的一部分。

    本文包括以下内容:

    • 输入法的生命周期
    • 在application manifest中声明IME组件
    • 输入法 API
    • 设计输入法的用户界面
    • 从输入法向应用程序发送文本
    • 创建不同类型的输入法

    如果你之前没有做过输入法的相关东西,你应该先阅读这篇介绍性的文章 Onscreen Input Methods。此外,SDK中包含的Soft Keyboard sample app项目里面有样例代码,你可以修改它们,然后开始创建自己的输入法。

    输入法的生命周期

    下图描述了一个输入法的生命周期:

    Android输入法生命周期

    接下来的部分描述了如何实现遵循这一生命周期,实现输入法代码和界面。

    在application manifest中声明IME组件

    在Android系统中,输入法是一个包含指定的IME服务的Android应用,应用的mainifest文件必须声明此服务,请求所需的权限,提供和 action.view.InputMethod匹配的 intent filter,并且提供包含输入法一些参数的元数据。此外,若想提供一个允许用户修改输入法行为的设置界面,你要定义一个能从系统设置中启动的 settingsactivity。

    下面的代码声明了一个输入法的service.它请求了 BIND_INPUT_METHOD 权限,来允许服务把IME和系统关联起来,创建一个 intent filter来匹配 android.view.InputMethod,并且定义了输入法的元数据。

       <!-- Declares the input method service -->
    <service android:name="FastInputIME"
        android:label="@string/fast_input_label"
        android:permission="android.permission.BIND_INPUT_METHOD">
        <intent-filter>
            <action android:name="android.view.InputMethod" />
        </intent-filter>
        <meta-data android:name="android.view.im" android:resource="@xml/method" />
    </service>
    

    下一个代码片段声明了输入法的设置activity.它包含了一个 ACTION_MAIN的 intent filter,表示此activity作为整个输入法应用的入口。

       <!-- Optional: an activity for controlling the IME settings -->
    <activity android:name="FastInputIMESettings" 
        android:label="@string/fast_input_settings">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
        </intent-filter>
    </activity>
    

    你也可以在输入法界面中直接提供用户设置。

    输入法API

    输入法相关的类可以在 android.inputmethodservice和 android.view.inputmethodpackages中找到。 KeyEvent类在处理键盘字符中非常重要。

    输入法的核心组件是一个服务,它是一个继承自 InputmethodService的类。除了实现常规的输入法声明周期外,该类还包含了一些回调函数,用来给开发者处理输入法界面,处理用户输入,并将文本发送给当前正在处理的文本域。默认情况下, InputmethodService类提供了管理输入法状态、可视化以及和当前输入法框交互的大部分实现。

    下面的类也非常重要:

    BaseInputConnection

    定义了从输入法回到当前接收输入的应用之间的通信管道。你可以使用它来获取焦点所在位置周围的文本,向文本域提交文本以及向应哟功能程序发送原始的键盘事件。应用应该继承这个类而不要独自实现基础的 InputConnection接口。

    KeyboardView

    继承自 View,用来渲染绘制一个键盘,并且响应用户的输入事件。键盘的布局就是用一个 Keyboard的实例来实现的,你可以通过创建一个xml文件来实现。

    设计输入法的用户界面

    输入法中主要有两种可视化的元素:输入界面和候选界面。你只需要实现和你设计的输入法有关的界面。

    输入界面

    输入法界面是用户输入文本的地方,可以是敲击键盘键位,手写,或者手势的形式。当输入法第一次调用显示的时候,系统会调用 onCreateInputView()。在方法实现中,你可以创建想显示的布局,并将创建的布局实例返回给系统,下面的代码片段是一个实现 onCreateInputView()方法的例子:

       @Override 
    public View onCreateInputView() { 
        MyKeyboardView inputView = 
            (MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);
    
        inputView.setOnKeyboardActionListener(this);                                                  
        inputView.setKeyboard(mLatinKeyboard); 
    return mInputView; 
    } 
    

    在这个例子中, MyKeyboardView是一个用来生成一个键盘的典型的例子.如果你要创建一个传统的QWERTY键盘,可以查看 Soft Keyboard sample app作为一个如何继承 KeyboardView类的样例。

    候选界面

    候选界面是输入法为用户提示预测纠错和建议选词的地方。在输入法的生命周期中,当候选界面准备显示的时候,系统会调用 OnCreateCandidateView(),你在实现此方法的时候,要返回用来显示建议词的界面,如果不想显示任何界面,就返回 null。(此方法默认返回null,如果不希望显示就不必实现此方法)

    关于实现给用户提供建议的例子,可以查看 Soft Keyboard sample app

    界面设计要考虑的事情

    这部分介绍一些关于输入法界面设计的东西。

    处理不同屏幕尺寸

    你的输入法界面必须能够适应不同的屏幕尺寸,并且可以处理横屏和竖屏。在非全屏输入模式中,给应用留有足够的空间来显示文本框以及相关的内容,所以输入法不能占用超过一半的屏幕空间。在全屏输入的模式中,这就不是问题了。

    处理不同的输入类型

    Android中的文本域允许开发者指定一个具体的输入类型,比如自由格式的文本,数字,URL,邮箱地址和查询字符串等。当你实现一个新的输入法的时候,你需要去检测每一个输入域的类型,并且为他提供合适的输入法实例。当然,你不需要去检测用户输入的数据在特定的输入类型中的合理性,那是应用的开发者的责任。

    例如,这里有一些Android系统提供的拉丁键盘的在处理文本和电话号码输入界面的截图

    当一个输入域得到输入焦点并且启动你的输入法的时候,系统会调用 onStartInputView(),并且传入一个 EditorInfo对象参数,里面包含了关于输入类型和其他文本域属性的细节,在这个对象中, inputType字段包含了文本域的输入类型。

    inputType字段是一个整型变量,它包含了基于位的规则表示各种各样的输入类型设置。若需要用它来检测不同的输入类型,用它和常量 TYPE_MASK_CLASS进行如下操作:

    **inputType & InputType.TYPE_MASK_CLASS **

    输入类型的位模式可以是下面多种值之一:

    • TYPE_CLASS_NUMBERA 输入数字的区域,就像前面截图中展示的那样,拉丁键盘在这种输入模式下显示了一个数字面板。

    • TYPE_CLASS_DATETIMEA 用于输入日期和时间的文本域。

    • TYPE_CLASS_PHONEA 用于输入电话号码的文本域

    • TYPE_CLASS_TEXTA 可以输入所有支持的字符的文本域。

    这些常量在参考文档 InputType中,有更加详细的描述。

    输入类型还包括其他的数值,表示普通文本输入的变体,例如:

    • TYPE_TEXT_VARIATION_PASSWORDA 用于输入密码的 TYPE_CLASS_TEXT的变体,输入法会将输入的字符显示为圆点。

    • TYPE_TEXT_VARIATION_URIA 用于输入URL和URI的 TYPE_CLASS_TEXT变体。

    • TYPE_TEXT_FLAG_AUTO_COMPLETEA 用于输入可以通过词典、查询或者其他组件自动完成的文本。

    要用这些常量检查输入类型的时候,注意要用正确的常量去和 inputType相与,可用的常量列表包含在文档 InputType中。

    注意:在你实现的输入法中,输入密码的时候,请确保正确的处理文本,在输入界面和候选界面中都要隐藏密码,同时,你不应该在设备中存储密码。要了解更多,参考 安全性设计指引。

    从输入法向应用程序发送文本

    当用户使用你开发的输入法输入文本时,你可以发送独立的键盘事件或者编辑光标所在的文本,来将文本发送到应用程序。在任何一种情况中,你可以使用一个 InputConncetion实例来发送文本,可以通过调用 InputMethodService.getCurrentInputConnection()来获得实例。

    编辑光标所在文本

    在一个文本框中处理文本的时候, BaseInputConnection类中包含了一些有用的方法:

    getTextBeforeCursor()

    返回一个包含光标前指定个数的字符 CharSequence

    getTextAfterCursor()

    返回一个包含光标后面指定个数的字符 CharSequence

    deleteSurroundingText()

    删除光标前后指定个数的字符

    commitText()

    提交文本并且重新设置光标的位置。

    例如,下面的代码片段展示了如何用文本『Hello』替换文本『Fell』左边的内容。

       InputConnection ic = getCurrentInputConnection();
    ic.deleteSurroundingText(4, 0);
    ic.commitText("Hello", 1);
    ic.commitText("!", 1);
    

    发送前组织文本

    如果你的输入法支持文本预测或者需要多个步骤来组成一个符号或者单词,你可以在文本编辑区域展示这个过程,直到用户最终提交了这个单词,然后你可以用完整的文本替换掉部分的编辑中的文本。你可以在间断的通过 InputConnection#setComposingText()提交文本。

    下面的代码展示了如何在文本域中显示过程:

       InputConnection ic = getCurrentInputConnection();
    ic.setComposingText("Composi", 1);
    ...
    ic.setComposingText("Composin", 1);
    ...
    ic.commitText("Composing ", 1);
    

    下面 的截图显示了用户看到的界面:

    监听硬键盘事件

    输入法窗口没有明确的焦点,它会首先接收来自硬键盘的事件,并且决定是处理事件还是继续向应用传递转发事件。例如,你可能会使用方向键在输入法界面中进行候选词的选择操作,也可能使用退格键来取消所有的从输入法窗口生成的弹出界面。

    要监听硬键盘事件,覆写 onKeyDown()和 oKeyUp方法,查看Softkeybaord  sample app 中的例子。

    记得调用 super()方法,如果你不想自己处理这些事件。

    创建输入法子类型

    子类型允许输入法展现不同的输入模式,同时在一个输入法中支持不同语言。一个子类型可能是:

    • 一个区域 比如en_US或者fr_FR
    • 一个输入模式,比如声音、键盘或者手写
    • 其他输入法风格,表单或者其他特性,比如九健或者全键盘布局

    基本上,模式可以是任何文本描述的,类似『键盘』,『声音』诸如此类。

    子类型信息用于输入法切换的对话框,可以通过通知栏中的输入法切换或输入法设置中找到。这些信息可以让框架为输入法直接选择专门的子类型。当你创建一个输入法的时候,使用子类型,因为它可以帮助用户识别和在不同的输入法语言和模式中切换。

    使用 <subtype>标签,在输入法的xml资源文件中定义子类型。下面的代码片段定义了一个包含两种子类型的输入法:一个针对美国英语区域,另一个针对法法语地区:

       <input-method xmlns:android="http://schemas.android.com/apk/res/android"
            android:settingsActivity="com.example.softkeyboard.Settings"
            android:icon="@drawable/ime_icon"
        <subtype android:name="@string/display_name_english_keyboard_ime"
                android:icon="@drawable/subtype_icon_english_keyboard_ime"
                android:imeSubtypeLanguage="en_US"
                android:imeSubtypeMode="keyboard"
                android:imeSubtypeExtraValue="somePrivateOption=true"
        />
        <subtype android:name="@string/display_name_french_keyboard_ime"
                android:icon="@drawable/subtype_icon_french_keyboard_ime"
                android:imeSubtypeLanguage="fr_FR"
                android:imeSubtypeMode="keyboard"
                android:imeSubtypeExtraValue="foobar=30,someInternalOption=false"
        />
        <subtype android:name="@string/display_name_german_keyboard_ime"
                ...
        />
    />
    

    为了确保你的子类型在用户界面中标记正确。使用 %s类获取和子类型区域一样的标签,下面的两段代码演示了这个方法。第一段代码来自输入法xml配置文件的一部分:

       <subtype
        android:label="@string/label_subtype_generic"
        android:imeSubtypeLocale="en_US"
        android:icon="@drawable/icon_en_us"
        android:imeSubtypeMode="keyboard" />
    

    下一段代码是 strings.xml文件的一部分, label_subtype_generic字符串资源用来设置输入法UI定义子类型的标签:

       <string name="label_subtype_generic">%s</string> 在任何的英语区域,这段代码会将子类型显示的名字设置为『英语(美国)』,或者对应其他区域的语言。
    

    通过通知栏选择输入法的子类型

    Android系统会管理所有输入法定义的子类型。输入法子类型作为定义他们的输入法的一种模式存在。在通知栏,用户可以选择当前使用的输入法的可用子类型,如下面的截图所示:

    通过系统设置选择输入法子类型

    在系统设置的 语言与输入设置面板中,用户可以选择子类型如何被使用。在Soft Keyboard的例子中, InputMethodSettingsFragment.java文件实现了一个输入法设置中的子类型激活开关。请参照Android SDK中输入法的例子,获得更多关于输入法子类型的信息。

    输入法注意事项

    在开发你自己的输入法时,还有一些要注意的问题:

    • 让用户可以在输入法界面中直接进入设置功能
    • 因为设备上可能安装了不同类型的输入法,让用户可以在输入法界面上直接切换不同的输入法
    • 快速的渲染输入法界面,预加载或者只加载需要的大的资源,这样用户可以在敲击文本框的时候立刻看到输入法界面。缓存资源和视图以便之后对输入法的调用。
    • 相反,你应该在输入法界面隐藏后,释放占用较大的内存,使应用程序拥有充足的内存运行。当输入法在一小段时间处于隐藏状态时,可以考虑使用延时消息来释放资源。
    • 确保用户在所处的语言区域中输入尽可能多的字符。记住用户可能在用户名或者密码中使用标点符号,所以你的输入法需要提供尽可能多的不同的字符,以便用户可以输入密码来访问设备。

    转自:  http://atleeon.com/code/2013/10/24/implementation-of-android-inputmethod/

    展开全文
  • 这份是输入法开发文档资料,对输入法的开发原理详述到位,适合作输入法研究入门的同行!其主要来源于网络,经刷选得到的!
  • 由于自带的输入法用的不习惯,我就自下了个(搜狗输入法),默认的是自下的 但打开文档(ward Excel PPT)总是电脑自带的,很是心烦。不知你们是不是,这里是windows7的系统 ...

    由于自带的输入法用的不习惯,我就自下了一个(搜狗输入法),默认的是自下的    但打开文档(ward  Excel  PPT)总是电脑自带的,很是心烦。不知你们是不是,这里是windows7的系统                                                                                                                                

    1.如图,图标右键设置

     

     

    2.使用自己喜欢的

     

    3.打开一个文档,点击文件---选项

     

     

    4.点高级

     

    OK了。

    展开全文
  • 藏文输入法帮助藏文输入法帮助藏文输入法帮助有实用
  • 行业文档-设计装置-嵌入式widget平台中的输入法系统及输入法实现方法.zip
  • Android文本框中的输入法控制(PDF文档
  • 文件包括了输入法的源码和移植文档,按文档做基本都能移植成功!
  • Ubuntu SCIM对于电脑使用的玩家的常用...Ubuntu SCIM输入法安装这里的方法同样适用于Debian下的Ubuntu SCIM输入法的安装。 根据Ubuntu SCIM的文档说明,装SCIM最好用UTF-8的locale。(你也可以使用GB2312以及GBK的

    Ubuntu SCIM对于电脑使用的玩家的常用软件,然后我就学习及深入的研究Ubuntu SCIM,在这里和大家一起探讨Ubuntu SCIM的使用方法,希望对大家有用。Ubuntu SCIM输入法安装这里的方法同样适用于Debian下的Ubuntu SCIM输入法的安装。

    根据Ubuntu SCIM的文档说明,装SCIM最好用UTF-8的locale。(你也可以使用GB2312以及GBK的locale,使用scim都一样的)对于一个新装好的没有安装SCIM的Ubuntu SCIM系统(新的Ubuntu安装器选择中文安装后,一边都已经装好了scim),只要apt-get install scim(当然前提是你要设置好源,具体见http://wiki.ubuntu.org.cn/%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97, 有些高校自己内部也有源的,好好找找)

    就已经安装好Ubuntu SCIM了!当然还不能用。因为Ubuntu SCIM只是一个输入法平台,还要在上面安装输入法(或者码表)。例如,apt-get install scim-chinese就可以使用智能拼音输入法了!当然在使用之前还要先配置一下,配置方法很简单,在/etc/X11/Xsession.d/里新建一个名叫95xinput的文件,文件内容如下

     
    1. /usr/bin/scim -d  
    2. XMODIFIERS="@im=SCIM" 
    3. export XMODIFIERS  
    4. export GTK_IM_MODULE=scim 

    保存文件,确认内容无误后,退出X(建议退出X后运行exit命令重新login一次),再进入X的时候就可以用Ctrl+Space调出Ubuntu SCIM了!就我的试验情况,这样已经可以在qterm里使用Ubuntu SCIM了。

    如果你需要其它中文输入法,可以这样apt-get install scim-tables-zh这包括了简体中文的五笔、二笔、广东拼音、自然码,和繁体中文的行列、 }頡五代、大易、注音等输入法了。

    我现在使用五笔输入法,能输入简繁汉字,词汇也丰富,很好用。

    但是现在还不能在基于GTK的软件中调出Ubuntu SCIM,例如我就不能在leafpad里使用Ubuntu SCIM。解决办法很简单,只要安装scim-gtk2-immodule就可以了。

    apt-get install scim-gtk2-immodule安装后无须重启X,只要重新打开基于GTK的软件就可以了,比如我新开一个leafpad,马上就可以使用Ubuntu SCIM了!这个命令会根据依赖关系自动安装 scim-server-socket, scim-frontend-socket, scim-config-socket,如果没有安装scim,也会自动安装。

    展开全文
  • 用用Python从从0开开始始实实现现一一个个中中文文拼拼音音输输入入法法的的思思路路详详解解 中文输入法个历史悠久的问题但也实在是个繁琐的活不知道这是不是网上很少有人分享中文拼音输入法 的原 接下来通过...
  • 行业文档-设计装置-种将联系人信息自动导入输入法自造词的方法
  • 行业文档-设计装置-笔画加加输入法.zip
  • 行业文档-设计装置-种汉字偏旁部首与笔画数的手机与计算机输入法
  • Android下创建输入法

    千次阅读 2016-02-22 17:37:49
    输入法种可以让用户输入文字的控件。Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音。当安装了特定输入法之后,用户即可在系统设置中...
    输入法是一种可以让用户输入文字的控件。Android提供了一套可扩展的输入法框架,使得应用程序可以让用户选择各种类型的输入法,比如基于触屏的键盘输入或者基于语音。当安装了特定输入法之后,用户即可在系统设置中选择个输入法,并在接下来的输入场景中使用该输入法。不过在任一时刻,只能使用一个输入法。
    

    为了在安卓系统下创建一个输入法,需要新建一个包含扩展了InputMethodService类的安卓应用,并创建一个用于设置的activity,用户可以通过它将设置选项传给输入法的service,因此,你还需要为该设置应用定义展现、交互界面,用于显示和改变输入法设置。

    本指南包含如下内容:

    • IME的生命周期
    • 在应用程序的manifest中声明IME组件
    • IME API
    • 设计IME UI界面
    • 将文本从输入法传递给所在的应用程序
    • 和IME subtypes配合工作

    如果你过去没有接触过输入法,建议先读这篇介绍性文章《Onscreen Input Methods》。在SDK中有一个输入法例程SoftKeyboard可供参考。

    输入法的生命周期

    下图描述了输入法完整的生命周期:

     

    图1:输入法的生命周期

    接下来的章节将描述如何实现输入法在生命周期中每一个节点的编码。

    在Manifest中声明输入法组件

    在安卓系统中,输入法是一个包含IME service的安卓应用程序。必须在该应用程序的manifest文件中声明service,请求必要的权限,提供能够匹配action.view.InputMethod 的intent filter,提供定义输入法特征的metadata。此外,还要提供一个可以用来修改输入法参数的设置界面,通过系统设置可以启动该界面。

    如下代码片段定义了一个输入法service:

    <!-- Declares the input method service -->
        <service android:name="FastInputIME"
            android:label="@string/fast_input_label"
            android:permission="android.permission.BIND_INPUT_METHOD">
            <intent-filter>
                <action android:name="android.view.InputMethod" />
            </intent-filter>
            <meta-data android:name="android.view.im"
    android:resource="@xml/method" />
        </service>

    第一行粗体字声明需要BIND_INPUT_METHOD权限来对接系统,第二行粗体字创建了一个能够匹配android.view.InputMethod的intent filter,第三行粗体字定义了输入法的metadata。

    接下来的代码片段声明了输入法的设置activity:

        <!-- Optional: an activity for controlling the IME settings -->
        <activity android:name="FastInputIMESettings"
            android:label="@string/fast_input_settings">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
            </intent-filter>
        </activity>

    其中的粗体字定义了一个能够匹配ACTION_MAIN的intent filter,这表明该acitvity是输入法应用的主入口。

    还可以在这里声明从UI访问输入法设置的权限。

    输入法API

    在android.inputmethodservice和android.view.inputmethod包中可以找到输入法相关的class。其中KeyEvent 是处理字符按键的重要类。

    输入法的中心环节就是一个service组件,该组件扩展了InputMethodService。除了实现普通的service生命周期以外,该类需要给UI层提供回调函数,用来处理用户输入,并且把文本传递给输入焦点。InputMethodService类实现了大部分管理输入法状态、界面以及和当前输入框通信的逻辑。

    以下class同样重要:

    BaseInputConnection

    定义了从输入法到接收输入的应用程序之间的通信通道。使用该类可以获取光标附近的文本,可以把字符串提交给文本框,还可以向应用程序发送原生的按键消息。应用程序应该扩展该类,而不要实现InputConnection。

    KeyboardView

    该类扩展了View使其能够展现出一个键盘并且相应用户的输入事件。可以通过一个XML文件来定义键盘布局。

    设计输入法界面

    输入法有两个主要的可见的界面元素:输入窗和候选窗。你只需要实现和输入法相关的界面元素即可。

    Input view

    输入窗是指用户通过按键或手写或手势直接产生的文本展示区域。当输入法首次展现时,系统调用onCreateInputView()回调函数。你需要在该方法中创建输入法界面布局,并将该布局返回给系统。下面的代码片段实现了onCreateInputView()方法:

        @Override
        public View onCreateInputView() {
            MyKeyboardView inputView =
                (MyKeyboardView) getLayoutInflater().inflate( R.layout.input, null);
    
            inputView.setOnKeyboardActionListener(this);
    inputView.setKeyboard(mLatinKeyboard);
    
            return mInputView;
        }

    在该实例中,MyKeyboardView实现了类KeyboardView,用来自定义一个键盘。如果你使用传统的QWERTY键盘,请参见KeyboardView类。

    Candidates view

    候选窗用来展现输入法转换过的供用户选择的候选字串,系统将调用onCreateCandidatesView()使输入法创建并展现出候选窗。你需要实现该方法,返回一套布局来展现候选窗,当不需要展现候选窗时可以返回null。该方法默认就会返回null,因此如果你什么都不做就会什么都不展现。

    在SoftKeyboard例程中你可以找到候选窗实现的例子。

    输入法UI设计的考虑

    本章讲述输入法中一些特殊的UI设计。

    处理不同的屏幕尺寸

    输入法的UI必须能够处理不同的屏幕尺寸,需要考虑到屏幕的纵深视图。在非全屏模式下,输入法必须为应用程序的输入框和相关上下文留出足够的空间,因此输入法不能占用超过一半的屏幕空间。全屏模式下则不存在这些问题。

    处理不同的输入类型

    安卓的输入框允许你给他设定输入类型,比如文本、数字、URL、email地址或者搜索串。当你实现了一个新的输入法,你需要探测每一个输入框的输入类型,并为之提供匹配的界面。当然,你不需要检查用户输入文字的合法性,这是应用程序的职责。

    例如,下面是输入法为输入类型为文本和电话号码的输入框展现的界面截图:

     图2

    当某个输入控件接收到焦点,输入法将被启动,系统会调用输入法的onStartInputView(),并传进来一个EditorInfo对象,该对象包含输入类型和其他输入控件的相关属性,其中inputType字段用来表示当前输入控件的输入类型。

    inputType字段是一个整形数据,它是不同的输入类型按位或出来的结果。可以使用掩码TYPE_MASK_CLASS来检测该字段的值,如:

    inputType & InputType.TYPE_MASK_CLASS

    其结果可能包含如下值:

    • TYPE_CLASS_NUMBER      当前输入控件只接受数字。如前面所述,此时输入法应该展现出数字键盘。
    • TYPE_CLASS_DATETIME    当前输入控件只接受日期和时间。

    • TYPE_CLASS_PHONE         当前输入控件只接受电话号码。

    • TYPE_CLASS_TEXT            当前输入控件接受所有字符。

    在InputType的参考手册文档中可以找到这些常量的详细描述。inputType字段还可以包含其他的文本变种类型,例如:

    • TYPE_TEXT_VARIATION_PASSWORD    表示当前的文本框是用于输入密码,此时输入法应该展现表示密码的符号而不是实际文字。
    • TYPE_TEXT_VARIATION_URI               表明当前文本框是用于输入URL或者URI字串。

    • TYPE_TEXT_FLAG_AUTO_COMPLETE    表明在当前文本框中输入文字时,应用程序会使用字典或搜索引擎或其他机制为其内容自动补全。

    在测试这些变种的时候要对inputType使用准确地常亮作比较。在InputType的参考手册文档中可以找到所有掩码常量的详细信息。

    注意:在你的输入法中,当要把字符传递给密码框时,一定要处理正确:在你的输入窗和候选窗中务必不要显示密码串,输入法也不要在设备中保存用户密码。在《安全设计指南》中可以了解到更多安全议题。

    把字符串发送给应用程序

    当用户使用输入法输入字符时,输入法有两种手段可以将文本发送给应用程序:一、向应用程序发送独立的键盘事件;二、编辑输入框中光标附近的文本。两种方式都需要使用一个InputConnection实例来传递字符串,调用InputMethodService.getCurrentInputConnection()就可以获得该实例。

    编辑光标附近的字符串

    当你对输入窗中已有的字符串展开编辑时,BaseInputConnection下的一些方法非常有用:

    • getTextBeforeCursor()      返回一个CharSequence对象,该对象包含光标前指定个数的字符。
    • getTextAfterCursor()        返回一个CharSequence对象,该对象包含光标后指定个数的字符。

    • deleteSurroundingText()   删除光标前后指定个数的字符。

    • commitText()                  把一个CharSequence对象提交给输入窗,并设置新的光标位置。

    下面的片段显示了怎样用“Hello!”替换光标左侧的四个字符:

        InputConnection ic = getCurrentInputConnection();
    
        ic.deleteSurroundingText(4, 0);
    
        ic.commitText("Hello", 1);
    
        ic.commitText("!", 1);

    在提交之前组织文本串

    如果你的输入法需要做预测或者要通过几步组织成象形文字,你可以先在输入框中显示当前的输入过程,最后再把组织成的最终字串提交给输入框,用这个最终字串替换掉之前的过程串。你可以把中间过程串传递给setComposingText()函数来展现这个过程。

    下面的代码段用以说明如何展现这个过程:

        InputConnection ic = getCurrentInputConnection();
    
        ic.setComposingText("Composi", 1);
    ...
        ic.setComposingText("Composin", 1);
    
    ...
        ic.commitText("Composing ", 1);

    以上代码的执行效果展现如下:

     图3:上屏前的写作串

    拦截硬键盘事件

    尽管输入法窗口没有输入焦点,但它能够第一个获得硬键盘按键消息,并且选择是否吃掉它还是继续向下传递给应用程序。例如,当方向键按下时,你可以在输入法候选窗上移动焦点候选,并吃掉这个按键消息;当退格键按下时,你可以取消输入法窗口弹出的任何输入窗或候选窗。

    覆盖onKeyDown()和onKeyUp()方法可以拦截硬键盘事件。详情可以参考SoftKeyboard例程。

    如果你不想处理该按键消息,记得调用父类的super()方法。

    创建输入法的subtype

    输入法可以通过subtype来定义它所支持的多种输入模式和语言。一个subtype可以包含如下属性:

    • 一种语言如en_US或fr_FR
    • 一种输入模式如语音、键盘或手写
    • 其他特殊的输入风格、形式或属性,例如10键或qwerty布局。

    输入模式可以是任何的键盘布局、语音输入等等形式。一个subtype可以是这些形式的组合。

    输入法可以在自己的选择面板中读取subtype信息来切换不同的subtype,通常在系统通知栏和输入法设置界面中展现该信息。系统框架还可以通过该信息直接创建出一个指定的输入法subtype。当你构建一个输入法时,应使用subtype功能,因为他可以帮助用户区分和切换不同的输入法语言和模式。

    可以再输入法的XML资源文件中定义subtype,使用<subtype>根元素。下面的片段定义了一款带有两个subtype的输入法:一个是英文键盘,另一个是法文键盘。

    <input-method xmlns:android="http://schemas.android.com/apk/res/android"
            android:settingsActivity="com.example.softkeyboard.Settings"
            android:icon="@drawable/ime_icon"
        <subtype android:name="@string/display_name_english_keyboard_ime"
                android:icon="@drawable/subtype_icon_english_keyboard_ime"
                android:imeSubtypeLanguage="en_US"
                android:imeSubtypeMode="keyboard"
                android:imeSubtypeExtraValue="somePrivateOption=true"
        />
        <subtype android:name="@string/display_name_french_keyboard_ime"
                android:icon="@drawable/subtype_icon_french_keyboard_ime"
                android:imeSubtypeLanguage="fr_FR"
                android:imeSubtypeMode="keyboard"
                android:imeSubtypeExtraValue="foobar=30,someInternalOption=false"
        />
        <subtype android:name="@string/display_name_german_keyboard_ime"
                ...
        />
    />

    为了保证你的subtype在UI中能正确地标示出来,要使用%s来获取subtype标签,这和获取subtype locale的方法一样。接下来会用两个代码段来示范,其中第一段是输入法的XML文件相关代码段:

        <subtype
            android:label="@string/label_subtype_generic"
            android:imeSubtypeLocale="en_US"
            android:icon="@drawable/icon_en_us"
            android:imeSubtypeMode="keyboard" />

    下一段是输入法的strings.xml文件部分,其中的资源label_subtype_generic定义如下,它会被输入法的UI界面使用:

    <string name="label_subtype_generic">%s</string>

    该设置可以使输入法的subtype的名字按照本地locale设置来显示。例如在英文locale下显示”English (United States)”

    从系统通知栏中选择输入法的subtype

    所有输入法暴露出的subtype会被安卓系统统一管理。一款输入法的所有subtypes均隶属于该输入法。如下所示,用户可以在系统通知栏中,选择当前输入法下任一可用的subtype:

    图4:从通知栏中选择输入法subtype

     图5:在系统设置面板中设置输入法的subtype

    从系统设置中选择输入法subtypes

    用户可以在系统的“语言和输入”设置面板中设置如何使用subtype。在SoftKeybaord例程的文件InputMethodSettingsFragment.java中包含了如何使用subtype的实现代码,研究该例程可以了解如何在输入法中支持subtype的更多信息。

     图6:选择一个输入法的语言

    在输入法的subtype中切换

    可以提供一些切换关键字,让用户更容易地在多个输入法subtype之间切换,这些关键字也可以是全局的语言图标。这样可以极大提升键盘的可用性,解决用户通电。要想能够方便的切换,需要完成如下步骤:

    1、在输入法的XML资源文件中声明supportsSwitchingToNextInputMethos=“true”,如下:

    <input-method xmlns:android="http://schemas.android.com/apk/res/android"
    
            android:settingsActivity="com.example.softkeyboard.Settings"
    
            android:icon="@drawable/ime_icon"
    
            android:supportsSwitchingToNextInputMethod=“true">

    2、调用shouldOfferSwitchingToNextInputMethod()方法。

    3、如果该方法返回true,则显示切换关键字。

    4、当用户选择了切换关键字后,调用switchToNextInputMeshod()方法,并在第二个参数中传入false。该false告诉系统平等对待所有subtype,不管他们属于哪个输入法。如果指定true,则要求系统在当前输入法内循环切换subtype。

    注意:在Android5.0(API level 21)之前,switchToNextInputMethod()还不知道supportsSwithcingToNextInputMethod属性。如果用户切换到某个输入法而没有切换关键字,他将会得到错误,而且可能无法轻易地切换出去。

    输入法典型问题考虑

    在你实现一款输入法的时候还有几件事需要考虑:

    • 从输入法界面上提供给用户修改设置的入口。
    • 因为系统里可能安装了多个输入法,需要在输入法界面上提供可以切换到别的输入法的入口。
    • 要让输入法界面尽可能快的切出来,尽可能地预加载或者在后台加载尺寸较大的资源,以便用户点击可输入文本框后立刻切出输入法,要给资源或者视图考虑做缓存,以备后用。
    • 当输入法界面被隐藏后,应该尽快释放输入法所占用的较大块的内存,以便应用程序总是有足够的内存可用。如果输入法被隐藏了一段时间后,考虑使用延迟消息来释放资源。
    • 要确保用户可以输入在当前语言和locale下的尽可能多的字符。切记用户可能会在密码或用户名中使用标点,所以输入法必须提供尽可能多的字符以满足用户输入的需要。如果某些字符数不出来,会直接导致他可能无法访问某台设备。

     

     

     

    展开全文
  • 梦里我做了个企业输入法,可以把企业中需要的输入(文字、文档、图片、数据、甚至流程和应用)都可以通过个企业输入法软件实现输入,客户端界面就类似QQ输入法、微软输入法的小工具,但他可以帮着企业用户更方便的...
  • fcitx4.0.pdf[linux小企鹅输入法帮助文档]
  • 行业文档-设计装置-汉字实用书写数字化输入法.zip
  • 编辑word文档过程中输入法无法正常使用怎么办??有的朋友在使用Word 2010过程中,遇到了这样的问题。每次打开word文档,程序就自动变成英文输入法,中文输入法就退出了,特别是搜狗输入法。即使在其他程序中也用不了...
  • 行业文档-设计装置-汉字三笔输入法
  • 输入法方案文档 1. 输入法流程图: 1) 打开页面注入js流程图: 启动浏览器,浏览器main.cpp会去调用TBrowserLoadInjectFile()接口,通过这个接口去加载inject_file_config.xml文件,这个文件记录...
  • 行业文档-设计装置-汉字二维三笔组合输入法.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,158
精华内容 15,663
关键字:

一到文档输入法没了