?
このドキュメントでは、 php中國語ネットマニュアル リリース
InputMethodManager
版本:Android 3.0 r1
?
結(jié)構(gòu)
繼承關(guān)系
public final class InputMethodManager extends Object
????????
java.lang.Object
android.view.inputmethod.InputMethodManager
?
類概述
整個(gè)輸入法框架(IMF)結(jié)構(gòu)的核心API,應(yīng)用程序之間進(jìn)行調(diào)度和當(dāng)前輸入法交互。你可以用Context.getSystemService()
取得這一接口的實(shí)例。
架構(gòu)總述(Architecture Overview)
輸入法框架(IMF)共有三個(gè)主要部分:
l? 輸入法管理器,管理各部分的交互。它是一個(gè)客戶端API,存在于各個(gè)應(yīng)用程序的context中,用來溝通管理所有進(jìn)程間交互的全局系統(tǒng)服務(wù)。
l? 輸入法(IME) ,實(shí)現(xiàn)一個(gè)允許用戶生成文本的獨(dú)立交互模塊。系統(tǒng)綁定一個(gè)當(dāng)前的輸入法。使其創(chuàng)建和生成,決定輸入法何時(shí)隱藏或者顯示它的UI。同一時(shí)間只能有一個(gè)IME運(yùn)行。
l? 客戶應(yīng)用程序,通過輸入法管理器控制輸入焦點(diǎn)和IME的狀態(tài)。一次只能有一個(gè)客戶端使用IME。
應(yīng)用程序(Applications)
大多數(shù)情況下,使用標(biāo)準(zhǔn)TextView或其子類的應(yīng)用程序只要做少量工作就可以讓軟鍵盤(soft input methods)正常工作。你要注意的是:
l?
正確設(shè)置你的可編輯文本視圖inputType
,這樣輸入法有足夠的上下文幫助用戶向其輸入文本。
l?
當(dāng)輸入法顯示時(shí)妥善處理隱藏屏幕空間。理想的情況下應(yīng)用程序應(yīng)處理窗口變小,如必要你可以利用系統(tǒng)執(zhí)行平移窗口。你應(yīng)在活動(activity)中設(shè)置windowSoftInputMode
屬性或調(diào)整創(chuàng)建窗口的相應(yīng)值,以便系統(tǒng)決定平移或縮放(它會嘗試自動調(diào)整但可能出錯(cuò))。
l?
你還可以通過相同的windowSoftInputMode
控制窗口的首選軟鍵盤狀態(tài)(打開、關(guān)閉等)。
通過API可以與IMF及其IME交互實(shí)現(xiàn)更細(xì)致的控制,如顯示或輸入?yún)^(qū)域,用戶選取某輸入法等。
當(dāng)你編寫自己的文本編輯器的時(shí)候,你要實(shí)現(xiàn)onCreateInputConnection(EditorInfo)
以返回你的InputConnection
的接口實(shí)例,用來允許IME和你的文本編輯域來交互。
輸入法(Input Methods)
一個(gè)輸入法(IME)是Service
(服務(wù))的實(shí)現(xiàn),通常繼承自 InputMethodService
。IME提供核心的 InputMethod
接口,盡管提供InputMethod
通常是由InputMethodService
來處理,而IME的實(shí)現(xiàn)只需要處理更高層的API。
???????? 更多信息參閱InputMethodService
。
安全(Security)
輸入法關(guān)系到許多安全問題,因其基本不受約束地驅(qū)動UI并監(jiān)視用戶輸入。Android輸入法框架還允許調(diào)度第三方IME,所必須小心以限制他們的選擇和相互作用。
以下是IMF背后安全架構(gòu)的要點(diǎn):
l?
只允許系統(tǒng)訪問經(jīng)BIND_INPUT_METHOD
權(quán)限
許可訪問IME的InputMethod
接口。通過綁定到要求這個(gè)權(quán)限的服務(wù)來強(qiáng)制實(shí)現(xiàn)這一點(diǎn)。所以系統(tǒng)可以保證沒有不被信任的客戶端在它的控制之外訪問到當(dāng)前的輸入法。
l? IMF中可能有許多客戶進(jìn)程,但在同一時(shí)間只有一個(gè)是激活的。未激活客戶端不能與IMF核心交互通過下述機(jī)制實(shí)現(xiàn)。
l?
輸入法客戶端只可訪問InputMethodSession
接口。每個(gè)客戶端創(chuàng)建一個(gè)接口實(shí)例,只有與激活客戶相關(guān)聯(lián)的會話的調(diào)用才會被IME處理。這點(diǎn)通過普通IME的
AbstractInputMethodService執(zhí)行,必須由IME顯式的處理,而IME正是InputMethodSession
的自定義實(shí)現(xiàn)。
l?
只有激活的InputConnection
接受操作。IMF通知每個(gè)客戶進(jìn)程是否激活,IMF忽略非激活進(jìn)程對當(dāng)前輸入聯(lián)接的調(diào)用。這確保了當(dāng)前IME只將事件和文本編輯交付用戶可見焦點(diǎn)的UI。
l?
一個(gè)IME永遠(yuǎn)不能在屏幕關(guān)閉時(shí)與 InputConnection
交互。這是通過當(dāng)屏幕關(guān)閉時(shí)所有客戶端無效,并防止不良IME在用戶無法關(guān)注其行為時(shí)驅(qū)動UI。
l? 客戶應(yīng)用程序可以要求系統(tǒng)選取一個(gè)新的IME,但不能編程式選擇之一。這是避免惡意程序在用戶導(dǎo)航到其它應(yīng)用程序時(shí),選擇自己的IME并保持運(yùn)行。也就是說,IME可以編程式的要求系統(tǒng)選擇其它IME,因它完全控制了用戶輸入。
l? 用戶在可切換至一個(gè)新的IME前必須顯式的啟用它,以確認(rèn)系統(tǒng)了解它,使其處于可用狀態(tài)。
?
常量
???????? public static final int HIDE_IMPLICIT_ONLY
???????? hideSoftInputFromWindow(IBinder,
int)
中的標(biāo)志,表示如果用戶未顯式地顯示軟鍵盤窗口,則隱藏窗口。
?????????????????? 常量值: 1 (0x00000001)
?
public static final int HIDE_NOT_ALWAYS
hideSoftInputFromWindow(IBinder,
int)
中的標(biāo)志,表示軟鍵盤窗口總是隱藏,除非開始時(shí)以SHOW_FORCED
顯示。
常量值: 2 (0x00000002)
?
public static final int RESULT_HIDDEN
showSoftInput(View,
int, ResultReceiver)
和 hideSoftInputFromWindow(IBinder,
int, ResultReceiver)
中ResultReceiver
結(jié)果代碼標(biāo)志:軟鍵盤窗口從顯示切換到隱藏時(shí)的狀態(tài)。
常量值: 3 (0x00000003)
?
public static final int RESULT_SHOWN
showSoftInput(View,
int, ResultReceiver)
和 hideSoftInputFromWindow(IBinder,
int, ResultReceiver)
中ResultReceiver
結(jié)果代碼標(biāo)志:軟鍵盤窗口從隱藏切換到顯示時(shí)的狀態(tài)。
常量值: 2 (0x00000002)
?
public static final int RESULT_UNCHANGED_HIDDEN
showSoftInput(View,
int, ResultReceiver)
和 hideSoftInputFromWindow(IBinder,
int, ResultReceiver)
中ResultReceiver
結(jié)果代碼標(biāo)志:軟鍵盤窗口不變保持隱藏時(shí)的狀態(tài)。
常量值: 1 (0x00000001)
?
public static final int RESULT_UNCHANGED_SHOWN
showSoftInput(View,
int, ResultReceiver)
和 hideSoftInputFromWindow(IBinder,
int, ResultReceiver)
中ResultReceiver
結(jié)果代碼標(biāo)志:軟鍵盤窗口不變保持顯示時(shí)的狀態(tài)。
常量值: 0 (0x00000000)
?
public static final int SHOW_FORCED
showSoftInput(View,
int)
標(biāo)志,表示用戶強(qiáng)制打開輸入法(如長按菜單鍵),一直保持打開直至只有顯式關(guān)閉。
常量值: 2 (0x00000002)
?
public static final int SHOW_IMPLICIT
showSoftInput(View,
int)
標(biāo)志,表示隱式顯示輸入窗口,非用戶直接要求。窗口可能不顯示。
常量值: 1 (0x00000001)
?
公共方法
public void displayCompletions (View view, CompletionInfo[] completions)
(譯者注:輸入法自動完成)
?
public InputMethodSubtype getCurrentInputMethodSubtype ()
(譯者注:獲取當(dāng)前輸入法類型?)
?
public List<InputMethodInfo> getEnabledInputMethodList ()
(譯者注:獲取已啟用輸入法列表?)
?
public List<InputMethodSubtype> getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)
?
?
public List<InputMethodInfo> getInputMethodList ()
(譯者注:獲取輸入法列表)
?
public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes ()
?
?
public void hideSoftInputFromInputMethod (IBinder token, int flags)
關(guān)閉/隱藏輸入法軟鍵盤區(qū)域,用戶不再看到或與其交互。只能由當(dāng)前激活輸入法調(diào)用,因需令牌(token)驗(yàn)證。
參數(shù)
token ????? 在輸入法啟動時(shí)提供令牌驗(yàn)證,驗(yàn)證后可對其進(jìn)行操作。
flags ?????? 提供額外的操作標(biāo)志。當(dāng)前可以為0或 HIDE_IMPLICIT_ONLY
, HIDE_NOT_ALWAYS
等位設(shè)置。
?
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)
hideSoftInputFromWindow(IBinder,
int, ResultReceiver)
的無返回值版:從窗口上下文中確定當(dāng)前接收輸入的窗口,隱藏其輸入法窗口
參數(shù)
windowToken 由窗口請求View.getWindowToken()
返回得到的令牌(token)。
flags ?????? 提供額外的操作標(biāo)志。當(dāng)前可以為0或 HIDE_IMPLICIT_ONLY
位設(shè)置。
?
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)
從窗口上下文中確定當(dāng)前接收輸入的窗口,要求隱藏其軟鍵盤窗口。它可由用戶調(diào)用并得到結(jié)果而不僅僅是顯式要求輸入法窗口隱藏。
參數(shù)
windowToken 由窗口請求View.getWindowToken()
返回得到的令牌(token)。
flags ?????? 提供額外的操作標(biāo)志。當(dāng)前可以為0或 HIDE_IMPLICIT_ONLY
位設(shè)置。
resultReceiver ?如不為空,當(dāng)IME處理請求告訴你完成時(shí)調(diào)用。你收到的結(jié)果碼可以是RESULT_UNCHANGED_SHOWN
, RESULT_UNCHANGED_HIDDEN
, RESULT_SHOWN
, 或 RESULT_HIDDEN
。
?
public void hideStatusIcon (IBinder imeToken)
(譯者注:隱藏狀態(tài)欄圖標(biāo)?)
?
public boolean isAcceptingText ()
當(dāng)前服務(wù)視圖接受全文編輯返回真。沒有輸入法聯(lián)接為false,這時(shí)其只能處理原始按鍵事件。
?
public boolean isActive (View view)
視圖為當(dāng)前輸入的激活視圖時(shí)返回真。
?
public boolean isActive ()
輸入法中的任意視圖激活時(shí)返回真。
?
public boolean isFullscreenMode ()
判斷相關(guān)輸入法是否以全屏模式運(yùn)行。全屏?xí)r,完全覆蓋你的UI時(shí),返回真,否則返回假。
?
public boolean isWatchingCursor (View view)
如當(dāng)前輸入法要看到輸入編輯者的光標(biāo)位置時(shí)返回真。
?
public void restartInput (View view)
如有輸入法聯(lián)接至視圖,重啟輸入以顯示新的內(nèi)容??稍谝韵虑闆r時(shí)調(diào)用此方法:視圖的文字導(dǎo)致輸入法外觀變化或有按鍵輸入流,如應(yīng)用程序調(diào)用TextView.setText()時(shí)。
???????? 參數(shù)
view ??????? 文字發(fā)生變化的視圖。
?
public void sendAppPrivateCommand (View view, String action, Bundle data)
對當(dāng)前輸入法調(diào)用 InputMethodSession.appPrivateCommand()
。
???????? 參數(shù)
view ??????? 可選的發(fā)送命令的視圖,如你要發(fā)送命令而不考慮視圖附加到輸入法,此項(xiàng)可以為空。
action ???? 執(zhí)行的命令名稱。必須是作用域的名稱,如前綴包名稱,這樣不同的開發(fā)者就不會創(chuàng)建沖突的命令。
data ??????? 命令中包含的任何數(shù)據(jù)。
?
public boolean setCurrentInputMethodSubtype (InputMethodSubtype subtype)
(譯者注:此方法為3.0中新增的方法)
?
public void setInputMethod (IBinder token, String id)
強(qiáng)制切換到新輸入法部件。只能由持有token的應(yīng)用程序(application)或服務(wù)(service) 調(diào)用當(dāng)前激活輸入法。
???????? 參數(shù)
token ????? 在輸入法啟動時(shí)提供令牌驗(yàn)證,驗(yàn)證后可對其進(jìn)行操作。
id ??? ???????? 切換到新輸入法的唯一標(biāo)識。
?
public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)
強(qiáng)制切換到一個(gè)新的輸入法和指定的類型。只能由持有token的應(yīng)用程序(application)或服務(wù)(service) 調(diào)用當(dāng)前激活輸入法。(譯者注:此方法為3.0中新增的方法)
???????? 參數(shù)
token ????? 在輸入法啟動時(shí)提供令牌驗(yàn)證,驗(yàn)證后可對其進(jìn)行操作。
id ??? ???????? 切換到新輸入法的唯一標(biāo)識。
subtype 切換到新輸入法的新類型。
?
public void showInputMethodAndSubtypeEnabler (String topId)
(譯者注:此方法為3.0中新增的方法)
?
public void showInputMethodPicker ()
(譯者注:顯示輸入法菜單列表)
?
public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)
如需要,顯式要求當(dāng)前輸入法的軟鍵盤區(qū)域向用戶顯示。當(dāng)用戶與視圖交互,用戶表示要開始執(zhí)行輸入操作時(shí),可以調(diào)用此方法。
???????? 參數(shù)
view ??????? 當(dāng)前焦點(diǎn)視圖,可接受軟鍵盤輸入。
flags ?????? 提供額外的操作標(biāo)志。當(dāng)前可以是0或SHOW_IMPLICIT
位設(shè)置。
resultReceiver ??????? 如不為空,當(dāng)IME處理請求告訴你完成時(shí)調(diào)用。你收到的結(jié)果碼可以是RESULT_UNCHANGED_SHOWN
, RESULT_UNCHANGED_HIDDEN
, RESULT_SHOWN
, 或 RESULT_HIDDEN
。
?
public boolean showSoftInput (View view, int flags)
showSoftInput(View,
int, ResultReceiver)
的無返回值版:如需要,顯式要求當(dāng)前輸入法的軟鍵盤區(qū)域向用戶顯示。
???????? 參數(shù)
view ??????? 當(dāng)前焦點(diǎn)視圖,可接受軟鍵盤輸入。
flags ?????? 提供額外的操作標(biāo)志。當(dāng)前可以是0或SHOW_IMPLICIT
位設(shè)置。
?
public void showSoftInputFromInputMethod (IBinder token, int flags)
顯示輸入法的軟鍵盤區(qū)域,這樣用戶可以到看到輸入法窗口并能與其交互。只能由當(dāng)前激活輸入法調(diào)用,因需令牌(token)驗(yàn)證。
???????? 參數(shù)
token ????? 在輸入法啟動時(shí)提供令牌驗(yàn)證,驗(yàn)證后可對其進(jìn)行操作。
flags ?????? 提供額外的操作標(biāo)志??梢允?/span>0或 SHOW_IMPLICIT
, SHOW_FORCED
位設(shè)置。
?
public void showStatusIcon (IBinder imeToken, String packageName, int iconId)
(譯者注:顯示狀態(tài)欄圖標(biāo)?)
?
public boolean switchToLastInputMethod (IBinder imeToken)
?
?
public void toggleSoftInput (int showFlags, int hideFlags)
(譯者注:切換軟鍵盤)
?
public void toggleSoftInputFromWindow (IBinder windowToken, int showFlags, int hideFlags)
本方法切換輸入法的窗口顯示。如輸入窗口已顯示,它隱藏。如無輸入窗口則顯示。
???????? 參數(shù)
windowToken ?由窗口請求View.getWindowToken()
返回得到的令牌(token)。
showFlags ????? 提供額外的操作標(biāo)志。當(dāng)前可以為0或 HIDE_IMPLICIT_ONLY
位設(shè)置。
hideFlags ??????? 提供額外的操作標(biāo)志。可以是0或 HIDE_IMPLICIT_ONLY
, HIDE_NOT_ALWAYS
位設(shè)置。
?
public void updateCursor (View view, int left, int top, int right, int bottom)
返回窗口的當(dāng)前光標(biāo)位置。
?
public void updateExtractedText (View view, int token, ExtractedText text)
(譯者注:當(dāng)內(nèi)容變化時(shí)文本編輯器調(diào)用此方法,通知其新提取文本。)
?
public void updateSelection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)
返回當(dāng)前選擇區(qū)域。
?
補(bǔ)充
文章鏈接
android 軟鍵盤 InputMethodManager
Android輸入法框的梳理
[推薦]android 輸入法框架簡介
開源拼音輸入法社區(qū)的大融合(libpinyin)
android中文輸入法實(shí)現(xiàn)
?
?