亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > 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必須提供許多不同的字符,以允許用戶輸入密碼并訪問設備。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美成人激情在线| 国产一区二区三区久久精品| 欧美激情乱人伦| 91精品国产综合久久香蕉922| 欧美精品激情blacked18| 最近2019好看的中文字幕免费| 国产在线一区二区三区| 亚洲a中文字幕| 日韩小视频在线观看| 欧美成人sm免费视频| 久久久av免费| 国产一区二区三区欧美| 色香阁99久久精品久久久| 正在播放亚洲1区| 日韩电影网在线| 色七七影院综合| 国产999精品视频| 欧美视频精品一区| 黑人狂躁日本妞一区二区三区| 亚洲欧洲在线视频| 38少妇精品导航| 亚洲欧洲午夜一线一品| 欧美精品久久久久久久免费观看| 亚洲一区二区在线| 亚洲精品国产精品国自产在线| 国产91免费观看| 国产精品中文字幕久久久| 欧美性xxxx极品hd满灌| 中文字幕日韩欧美在线| 日本不卡视频在线播放| 国产福利精品在线| 精品亚洲国产视频| 亚洲最大成人网色| 国产精品日韩久久久久| 韩国19禁主播vip福利视频| 久久999免费视频| 成人做爽爽免费视频| 国产精品成人国产乱一区| 国产亚洲一区二区精品| 亚洲欧洲一区二区三区在线观看| 中文字幕av一区二区三区谷原希美| 中文字幕免费精品一区高清| 日韩少妇与小伙激情| 91精品视频免费看| 国产精品视频播放| 亚洲欧美中文另类| 欧美专区中文字幕| 中文字幕自拍vr一区二区三区| 55夜色66夜色国产精品视频| 欧洲精品毛片网站| 欧美亚洲免费电影| 国产精品高潮呻吟久久av无限| 中文字幕欧美日韩在线| 国产网站欧美日韩免费精品在线观看| 亚洲精选在线观看| 国产视频久久久久久久| yw.139尤物在线精品视频| 欧美日韩午夜激情| 91最新国产视频| 久久免费高清视频| 久久久在线观看| 亚洲一区二区三区视频| 高清一区二区三区日本久| 日韩av在线电影网| 精品国产鲁一鲁一区二区张丽| 亚洲精品不卡在线| 日本亚洲欧美三级| 亚洲自拍偷拍视频| 国产午夜精品一区理论片飘花| 久久久久亚洲精品成人网小说| 久久精品国产清自在天天线| 欧美日韩在线视频观看| 日韩欧美在线一区| 亚洲精品国精品久久99热| 亚洲精品美女久久久久| 青青草原成人在线视频| 热久久美女精品天天吊色| 欧美成人久久久| 欧美成人亚洲成人日韩成人| 亚洲自拍欧美色图| 国产91在线播放精品91| 日韩动漫免费观看电视剧高清| 97超碰国产精品女人人人爽| 国产精品高清免费在线观看| 亚洲第一福利网| 欧美一级大片在线免费观看| 国产成人自拍视频在线观看| 久久久综合av| 国产精品1234| 国产成人亚洲综合91精品| 日韩中文字幕不卡视频| 日韩av在线不卡| 欧美大片免费观看在线观看网站推荐| 欧美精品一二区| 国产日韩欧美夫妻视频在线观看| 亚洲伊人久久大香线蕉av| 国产91精品黑色丝袜高跟鞋| 亚洲欧美日韩国产精品| 欧美一级电影在线| 伊人伊成久久人综合网站| 国产黑人绿帽在线第一区| 91成人天堂久久成人| 欧美亚洲午夜视频在线观看| 国产欧美日韩综合精品| 中文字幕亚洲无线码在线一区| 国产ts人妖一区二区三区| xxxx性欧美| 日韩欧美成人免费视频| 九九九久久久久久| 欧美日韩一区二区三区在线免费观看| 51久久精品夜色国产麻豆| 精品久久香蕉国产线看观看亚洲| 97人人爽人人喊人人模波多| 国产精品久久久久久av福利| 欧美一级免费视频| 成人久久一区二区三区| 亚洲人在线观看| 国产精品女人久久久久久| 精品久久久久久久久久| 日韩av电影免费观看高清| 影音先锋欧美精品| 青青青国产精品一区二区| 精品日本美女福利在线观看| 国产视频福利一区| 国产精品欧美日韩| 国产精品自产拍在线观看中文| 国产亚洲欧美日韩精品| 亚洲成人国产精品| 亚洲午夜av电影| 国产精品久久一区主播| 欧美xxxx14xxxxx性爽| 91久久精品国产91久久性色| 国产精品入口日韩视频大尺度| 欧美精品久久久久a| 亚洲在线免费观看| 欧美激情中文字幕在线| 国产91精品久久久久| 久色乳综合思思在线视频| 色综合久久久久久中文网| 91视频-88av| 亚洲va欧美va在线观看| 国产日韩欧美夫妻视频在线观看| 亚洲第一区第一页| 成人久久一区二区三区| 欧美性猛交xxxxx免费看| 亚洲欧美激情四射在线日| 亚洲国产精品成人va在线观看| 欧美最猛性xxxxx(亚洲精品)| 成人免费淫片aa视频免费| 久久99视频免费| 亚洲人成电影网站色…| 在线不卡国产精品| 91久久在线视频| 日韩有码在线观看| 久久天天躁狠狠躁夜夜躁| 精品国产999| 国产亚洲精品久久久久久777| 亚洲欧美色婷婷| 亚洲精品日韩久久久| 国产99久久精品一区二区 夜夜躁日日躁| 日韩av在线网| 国产精品视频导航| 日本韩国欧美精品大片卡二| 亚洲精品中文字幕av|