麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 系統 > Android > 正文

Android輸入法開發

2019-11-09 17:32:56
字體:
來源:轉載
供稿:網友

輸入法編輯器(IME)是一個便于用戶輸入文本的控件。Android提供了一個可擴展的輸入法框架,允許應用程序提供可替代的輸入法,比如屏幕上的鍵盤或者語音輸入。在安裝 輸入法后,用戶可以通過系統選項選擇想要使用的輸入法。

想要添加一個輸入法,你需要創建一個Android應用并包含一個繼承自InputMethodService的類。此外,同城創建一個設置頁面來承載輸入發的各個選項。你可以自行定義一個設置的UI。

下面講述以下幾個內容: · 輸入法的生命周期 · 在應用的清單文件中定義輸入法組件 · 輸入法相關接口 · 設計一個款輸入法的UI · 發送文本到應用 · 輸入法子類型的使用

一、輸入法的生命周期

輸入法的生命周期如下圖所示:

輸入法生命周期

下面的部分講述如何根據輸入法的生命周期實現UI和輸入法功能。

二、在清單文件中定義輸入法組件 在Android系統中,IME是一個包含特殊IME服務的應用程序。應用的清單文件必須聲明輸入法服務,請求必須的權限,提供一個intent filter來匹配 action.view.InputMethod,并提供定義了IME特征的元數據(metadata)。此外,可以定義一個設置頁面來提供用戶修改IME配置的接口,它可以被系統設置所啟動。 下面的代碼片段聲明了一個IME服務。請求了 BIND_INPUT_METHOD 權限來允許服務連接到系統的IME,建立intent filter和metadata:

<!-- 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>

下面的代碼片段聲明了IME的設置頁面,它擁有 ACTION_MAIN 的intent filter來表示它是IME程序的主入口。

<!-- 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>

也可以從IME的UI提供直接進入設置的入口。

三、輸入法API 與IME相關的類在 android.inputmethodservice 和 android.view.inputmethod 包中。KeyEvent 類對于處理鍵盤特征至關重要。 IME的核心部分是一個服務組件,即一個繼承自InputMethodService的類。此外為了實現一般服務的生命周期,這個類提供了IME的UI,處理用戶輸入和傳輸文本到指定區域以及當前焦點的回調。InputMethodService類提供了絕大多數管理IME狀態和與當前輸入區域交互的實現。

下面幾個類也很重要。 BaseInputConnection 定義了輸入法和應用之間接收輸入的交互通道。使用它來讀取光標周圍的文本,提交文本到輸入框以及發送鍵盤事件給應用。應用應該集成此類。

KeyboardView 一個View的擴展,描繪了一個鍵盤和用戶輸入事件的響應。鍵盤的布局是被Keyboard的實例指定,可以定義一個XML文件。

四、設計輸入法UI IME有兩個主要的視覺元素:即輸入視圖和備選視圖。你只需要實現和你設計的輸入法有關的元素。

1.輸入視圖 輸入視圖是用戶使用按鍵,手寫或者手勢在表單中輸入文本的UI。 當IME第一次顯示,系統會調用 onCreateInputView() 回調。在你實現的這個方法中,你創建你想要的IME窗口的布局并返回給系統。下面片段是一個例子:

@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 類。

2.候選視圖 候選視圖是供用戶選擇可選詞和推薦詞的視圖。在IME的生命周期中,系統在準備好顯示備選視圖的時候會調用onCreateCandidatesView()。在你實現的這個方法中,返回顯示詞匯建議的布局,當什么都不顯示時,返回null。 若要查看實現用戶建議詞匯的例子,請查看SoftKeyboard示例應用。

3.UI設計依據 此部分介紹了一些IME的UI設計思想。

· 應對多元化的屏幕尺寸 你的IME的UI必須可以適配不同屏幕的尺寸,且必須處理豎屏和橫屏兩種方向。在非全屏模式下,為應用程序留出足夠的空間以顯示文本字段和任何相關聯的上下文,使得IME不會占用屏幕一半以上的空間。在全屏模式下沒有這個問題。

· 處理不同的輸入類型 Android的輸入框允許你選擇一個特殊的輸入類型,比如自由文本,數字,網址,郵箱地址,收索內容等。當你實現一個新的IME,您需要檢測每個字段的輸入類型,并為其提供適當的接口。但是,你不必設置IME以檢查用戶輸入的文本對輸入類型有效; 這是擁有文本字段的應用程序的責任。

當輸入字段接收焦點并且您的IME啟動時,系統調用 onStartInputView(),傳遞一個 EditorInfo 對象,該對象包含有關文本字段的輸入類型和其他屬性的詳細信息。 在此對象中,inputType 字段包含文本字段的輸入類型。 輸入類型字段是一個包含用于各種輸入類型設置的位模式的int參數。 要測試它的文本字段的輸入類型,用常量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_CLASS_TEXT 的變體。 輸入法將顯示標記,而不是實際文本。 TYPE_TEXT_VARIATION_URI 用于輸入網址和其他統一資源標識符(URI)的TYPE_CLASS_TEXT 的變體。 TYPE_TEXT_FLAG_AUTO_COMPLETE TYPE_CLASS_TEXT 的變體,用于輸入應用程序從字典,搜索或其他工具中“自動完成”的文本。 記住在測試這些變量時,用適當的常數掩蔽輸入類型。 可用的掩碼常數在輸入類型的參考文檔中列出。

注意:在您自己的IME中,確保在將其發送到密碼字段時正確處理文本。 在輸入視圖和候選視圖中的用戶界面中隱藏密碼。 還要記住,您不應該在設備上存儲密碼。 要了解更多信息,請參閱“為安全性設計”指南。

五、向應用程序發送文本 當用戶使用IME輸入文本時,您可以通過發送單個鍵事件或在應用程序的文本字段中編輯光標周圍的文本來向應用程序發送文本。 在任一情況下,您都使用 InputConnection 的實例來傳遞文本。 要獲取此實例,請調用 InputMethodService.getCurrentInputConnection() 。

1.編輯光標周圍的文本 當處理文本字段中現有文本的編輯時,BaseInputConnection 中一些更有用的方法是: getTextBeforeCursor() 返回包含當前光標位置之前的請求字符數的 CharSequence 。 getTextAfterCursor() 返回包含當前光標位置后的請求字符數的 CharSequence 。 deleteSurroundingText() 刪除當前光標位置前后的指定數量的字符。 commitText() 向文本字段提交 CharSequence 并設置新的光標位置。

例如,以下代碼段顯示如何使用文本“Hello!”替換光標左側的四個字符:

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

2.在提交之前撰寫文本 如果您的IME執行文本預測或需要多個步驟來組成字形或單詞,則可以在文本字段中顯示進度,直到用戶提交單詞,然后您可以用完成的文本替換部分組合。 當你傳遞給 setComposingText()時,你可以通過添加一個“span”來對文本進行特殊處理。 以下代碼段顯示了如何在文本字段中顯示進度:

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

以下屏幕截圖顯示了用戶看到的頁面: 這里寫圖片描述這里寫圖片描述這里寫圖片描述

3.攔截硬件按鍵事件 即使輸入法窗口沒有明確的焦點,它首先接收硬件鍵事件,并且可以選擇使用它們或將它們轉發到應用程序。 例如,您可能想要使用方向鍵在UI中導航以在組合期間選擇候選項。 您可能還想捕獲返回鍵以關閉源自輸入法窗口的任何彈出窗口。 要攔截硬件鍵,重寫onKeyDown()和 onKeyUp()。 請參閱 SoftKeyboard 示例應用程序的示例。 記住要為你不想處理的鍵調用super()方法。

六、創建IME子類型 子類型允許IME公開IME支持的多種輸入模式和語言。 子類型可以表示: · 區域設置,如en_US或fr_FR · 輸入模式,如語音,鍵盤或手寫 · IME特有的其他輸入樣式,表單或屬性,例如10鍵或qwerty鍵盤布局。

基本上,模式可以是諸如“鍵盤”,“語音”等的任何文本。 子類型還可以暴露這些的組合。 子類型信息用于IME切換器對話框,該對話框可從通知欄和IME設置中使用。 該信息還允許框架直接引出IME的特定子類型。 當構建IME時,使用子類型工具,因為它有助于用戶識別和在不同的IME語言和模式之間切換。

您可以使用元素在輸入法的XML資源文件之一中定義子類型。 以下代碼段定義了一個具有兩個子類型的IME:美國英語語言環境的鍵盤子類型,法國的法語語言環境的另一個鍵盤子類型

<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="some1.從通知欄中選擇TIME子類型 Android系統管理所有IME公開的所有子類型。 IME子類型被視為它們所屬的IME的模式。 在通知欄中,用戶可以為當前設置的IME選擇可用的子類型,如以下屏幕截圖所示: 這里寫圖片描述

這里寫圖片描述

2.從系統設置選擇IME子類型 用戶可以在“系統設置”區域的“語言和輸入”設置面板中控制子類型的使用方式。 在 SoftKeyboard 示例應用程序中,文件InputMethodSettingsFragment.java包含一個在IME設置中實現子類型啟用程序的實現。 有關如何在IME中支持輸入法子類型的更多信息,請參閱Android SDK中的 SoftKeyboard 示例應用程序。

這里寫圖片描述

3.在IME子類型之間切換 您可以允許用戶通過提供切換鍵(如球形語言圖標)作為鍵盤的一部分,在多個IME子類型之間輕松切換。 這樣做大大提高了鍵盤的可用性,并可以幫助避免用戶的失望。 要啟用此類切換,請執行以下步驟: (1). 在輸入法的XML資源文件中聲明 supportsSwitchingToNextInputMethod = “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). 當用戶點擊切換鍵時,調用 switchToNextInputMethod(),將false傳遞給第二個參數。 值false表示系統平等對待所有子類型,而不管它們屬于什么IME。 指定true要求系統在當前IME中循環遍歷子類型。

注意:在Android 5.0(API級別21)之前,switchToNextInputMethod()不知道 supportsSwitchingToNextInputMethod 屬性。 如果用戶切換到IME而沒有切換鍵,他可能會卡在該IME中,無法輕松地切換出來。

七、一般IME注意事項 以下是您實現IME時需要考慮的其他事項: · 為用戶提供一種直接從IME的UI設置選項的方法。 · 因為設備上可以安裝多個IME,所以提供了用于用戶從輸入法UI直接切換到不同的IME的方式。 · 快速啟動IME的UI。根據需要預加載或加載任何大型資源,以便用戶在點擊文本字段時看到IME。緩存資源和視圖,用于后續調用輸入法。 · 相反,您應該在隱藏輸入法窗口后立即釋放大量內存分配,以便應用程序可以有足夠的內存來運行。如果IME處于隱藏狀態幾秒鐘,請考慮使用延遲消息來釋放資源。 · 請確保用戶可以為與IME關聯的語言或區域設置輸入盡可能多的字符。請記住,用戶可以在密碼或用戶名中使用標點符號,因此您的IME必須提供許多不同的字符,以允許用戶輸入密碼并訪問設備。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩欧美精品中文字幕 | 亚洲不卡 | 亚洲小视频在线观看,com | 91网站免费观看 | 成人免费观看av | 国产精品久久久久久久模特 | 免费午夜视频 | 欧美一级淫片免费播放口 | 久久精品国产99久久6动漫亮点 | 91在线观看 | 久久超| 久久精品欧美一区二区 | 久久久久久中文字幕 | 久久精品亚洲国产奇米99 | 黄色网页在线观看 | 久久99精品国产99久久6男男 | 欧美三级短视频 | 91美女视频在线观看 | 免费色片 | 久久福利电影网 | 国产羞羞视频在线观看免费应用 | 日本高清黄色片 | 国产电影精品久久 | 久久亚洲春色中文字幕久久 | 欧美高清视频一区 | 欧美日韩高清在线观看 | 蜜桃久久一区二区三区 | 国产精品美女久久久免费 | 欧美天堂一区 | 久久久久久久久久综合 | 精品偷拍久久 | 中国女警察一级毛片视频 | 欧美成人免费 | 精品中文字幕在线观看 | 久久久成人999亚洲区美女 | 国内精品免费一区二区2001 | 成人午夜视频在线观看 | 一级片久久免费 | 亚洲网站免费看 | 国产成人精品一区二区视频免费 | 国产999精品久久久久 |