b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Android在安卓系统下创建一个输入法的生命周期

电脑杂谈  发布时间:2021-02-03 22:02:50  来源:网络整理

输入法是允许用户输入文本的控件。 Android提供了一组可扩展的输入法框架,因此应用程序可以允许用户选择各种类型的输入法,例如触摸屏键盘输入或基于语音的输入法。安装特定的输入法后,用户可以在系统设置中选择一种输入法,并在以下输入方案中使用该输入法。但是,一次只能使用一种输入法。

为了在Android系统下创建输入法,您需要创建一个新的Android应用程序,该应用程序扩展InputMethodService类并为设置创建活动。用户可以通过它将设置选项传递给输入法服务。因此,还需要为设置应用程序定义显示和交互界面,以显示和更改输入法设置。

本指南包含以下内容:

如果您以前从未接触过输入法,建议您首先阅读这篇介绍性文章“屏幕输入法”。 SDK中有一个输入法例程SoftKeyboard供参考。

输入法的生命周期

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

安卓输入法程序编写

图1:输入法的生命周期

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

在清单中声明输入法组件

在Android系统中,输入法是包含IME服务的Android应用程序。您必须在应用程序的清单文件中声明服务,请求必要的权限,提供可以匹配action.view.InputMethod的意图过滤器,并提供定义输入法特征的元数据。此外,有必要提供一个设置界面,该界面可用于修改输入法参数,该参数可通过系统设置激活。

以下代码段定义了一种输入法服务:


    <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的意图过滤器,第三行中的粗体文本定义输入法的元数据。

以下代码段声明了输入法设置活动:

    
    <activity android:name="FastInputIMESettings"
        android:label="@string/fast_input_settings">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
        intent-filter>
    activity>

粗体文本定义了一个可以匹配ACTION_MAIN的意图过滤器,它指示活动性是输入法应用程序的主要入口。

您还可以在此处声明从用户界面访问输入法设置的权限。

输入法API

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

输入法的中央链接是服务组件,它扩展了InputMethodService。除了实现普通的服务生命周期外,此类还需要向UI层提供回调函数,以处理用户输入并将文本传递给输入焦点。 InputMethodService类实现了管理输入法状态,接口以及与当前输入框的通信的大多数逻辑。

以下类同样重要:

BaseInputConnection

定义从输入方法到接收输入的应用程序的通信通道。使用此类可将文本移到光标附近,将字符串提交到文本框,然后将本机按键消息发送给应用程序。应用程序应该扩展此类,而不是实现InputConnection。

KeyboardView

此类扩展了View以显示键盘并响应用户输入事件。可以通过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实现了KeyboardView类以自定义键盘。如果您使用传统的QWERTY键盘,请参见KeyboardView类。

候选人视图

候选窗口用于显示通过输入法转换后的候选字符串,以供用户选择。系统将调用onCreateCandidatesView()来使输入法创建并显示候选窗口。您需要实现此方法以返回一组布局以显示候选窗口,并且在不需要显示候选窗口时可以返回null。默认情况下,此方法返回null,因此,如果您不执行任何操作,则不会显示任何内容。

您可以在SoftKeyboard示例中找到候选窗口实现的示例。

关于输入法UI设计的考虑

本章介绍了输入法中的一些特殊UI设计。

处理不同的屏幕尺寸

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

处理不同的输入类型

Android的输入框可让您设置输入类型,例如文本,数字,URL,电子邮件地址或搜索字符串。实施新的输入法时,需要检测每个输入框的输入类型并为其提供匹配的接口。当然,您不需要检查用户输入的文本的合法性,这是应用程序的责任。

例如,以下是显示在输入框中的界面的屏幕截图,输入类型为文本和电话号码:

安卓输入法程序编写

图2

当输入控件获得焦点时,将启动输入方法,系统将调用输入方法的onStartInputView(),并传递一个EditorInfo对象,该对象包含输入类型和其他输入控件的相关属性,其中inputType字段用于指示当前输入控件的输入类型。

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

inputType和InputType.TYPE_MASK_CLASS

结果可能包含以下值:

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

在测试这些变体时,应准确,不断地使用inputType进行比较。所有掩码常量的详细信息都可以在InputType参考手册文档中找到。

注意:在输入法中,要将字符传递到密码框中时,必须正确处理:不要在输入窗口和候选窗口中显示密码字符串,也不要在输入法中保存输入法。设备用户密码。可以在“安全设计指南”中了解更多安全问题。

将字符串发送到应用程序

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

编辑光标附近的字符串

在输入窗口中展开和编辑现有字符串时,BaseInputConnection下的一些方法非常有用:

以下代码段显示了如何用“ Hello!”替换光标左侧的四个字符:

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

在提交之前整理文本字符串

如果需要在几个步骤中预测您的输入方法或将其组织成象形文字,则可以首先在输入框中显示当前输入过程,最后将组织的最终字符串提交到输入框中,请使用最终字符串将替换先前的进程字符串。您可以将中间过程字符串传递给setComposedText()函数以显示该过程。

以下代码段说明了如何显示此过程:

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

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

图3:在屏幕上写入字符串

拦截硬键盘事件

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

重写onKeyDown()和onKeyUp()方法以拦截硬键盘事件。有关详细信息,请参阅SoftKeyboard例程。

如果您不想处理按键消息,请记住调用父类的super()方法。

创建输入法的子类型

输入法可以通过子类型定义其支持的多种输入模式和语言。子类型可以包含以下属性:

输入模式可以是任何键盘布局,语音输入等。子类型可以是这些形式的组合。

输入法可以在其自己的选择面板中读取子类型信息,以在不同的子类型之间切换。此信息通常显示在系统通知栏和输入法设置界面中。系统框架还可以通过此信息直接创建指定的输入法子类型。构建输入法时,应使用子类型功能,因为它可以帮助用户区分和在不同的输入法语言和模式之间进行切换。

您可以在输入法的XML资源文件中定义子类型,并使用根元素。以下代码段定义了一种具有两类型的输入法:一种是英语键盘,另一种是法语键盘。

用c语言编写小程序_程序流程图编写规范_安卓输入法程序编写

<input-method xmlns:android="http://schemas.android.com/apk/res/android"
        android:settingsActivity="com.example.softkeyboard.Settings"
        android:icon="@drawable/ime_icon"
    ="@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"
            ...
    />
/>

为了确保可以在UI中正确标记您的子类型,您需要使用%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">%sstring>

此设置允许根据区域设置显示输入法的子类型名称。例如,在英语语言环境下显示“英语(美国)”

从系统通知栏中选择输入法子类型

所有输入法公开的子类型将由Android系统统一管理。输入法的所有子类型都属于该输入法。如下所示,用户可以在系统通知栏中的当前输入法下选择任何可用的子类型:

图4:从通知栏中选择输入法子类型

安卓输入法程序编写

图5:在系统设置面板中设置输入法子类型

从系统设置中选择输入法子类型

用户可以在系统的“语言和输入”设置面板中设置如何使用子类型。 SoftKeybaord例程的文件InputMethodSettingsFragment.java包含有关如何使用子类型的实现代码。学习此例程可以了解有关如何在输入法中支持子类型的更多信息。

安卓输入法程序编写

图6:选择一种输入法语言

切换输入法的子类型

可以提供一些切换关键字,以使用户更容易在多个输入法子类型之间进行切换。这些关键字也可以是全局语言图标。这样可以大大提高键盘的可用性并解决用户的力量。为了能够轻松切换,您需要完成以下步骤:

1、在输入法的XML资源文件中声明supportingSwitchingToNextInputMethos =“ 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,则显示switching关键字。

4、当用户选择switch关键字时,将调用switchToNextInputMeshod()方法,并在第二个参数中传递false。该假值告诉系统将所有子类型同等对待,无论它们属于哪种输入方法。如果指定true,则要求系统在当前输入法内循环浏览子类型。

注意:在Android5.0(API级别21))之前,switchToNextInputMethod()不知道supportsSwithcingToNextInputMethod属性。如果用户在不切换关键字的情况下切换到某个输入法,则会收到错误消息,并且可能不容易切换出去。

典型输入法注意事项

实现输入法时需要考虑以下几点:


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-353279-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 李縠
        李縠

        可能不合格么

      • 文彦博
        文彦博

        质检总局是怕人家说他们只拿钱不干活儿

      • 沈晦
        沈晦

        放个屁都有道理

      热点图片
      拼命载入中...