標籤:
本文
一、結構
public final class InputMethodManager extends Object
Java.lang.Object
android.view.inputmethod.InputMethodManager
二、類概述
整個IME架構(IMF)結構的核心API,應用程式之間進行調度和當前IME互動。你可以用Context.getSystemService()取得這一介面的執行個體。
架構總述(Architecture Overview)
IME架構(IMF)共有三個主要部分:
* IME管理器,管理各部分的互動。它是一個用戶端API,存在於各個應用程式的context中,用來溝通管理所有進程間互動的全域系統服務。
* IME(IME) ,實現一個允許使用者產生文本的獨立互動模組。系統綁定一個當前的IME。使其建立和產生,決定IME何時隱藏或者顯示它的UI。同一時間只能有一個IME運行。
* 客戶應用程式,通過IME管理器控制輸入焦點和IME的狀態。一次只能有一個用戶端使用IME。
應用程式(Applications)
大多數情況下,使用標準TextView或其子類的應用程式只要做少量工作就可以讓軟鍵盤(soft input methods)正常工作。你要注意的是:
* 正確設定你的可編輯文本視圖inputType,這樣IME有足夠的上下文協助使用者向其輸入文本。
* 當IME顯示時妥善處理隱藏螢幕空間。理想的情況下應用程式應處理視窗變小,如必要你可以利用系統執行平移視窗。你應在活動(activity)中設定windowSoftInputMode屬性或調整建立視窗的相應值,以便系統決定平移或縮放(它會嘗試自動調整但可能出錯)。
* 你還可以通過相同的windowSoftInputMode控制視窗的首選軟鍵盤狀態(開啟、關閉等)。
通過API可以與IMF及其IME互動實現更細緻的控制,如顯示或輸入地區,使用者選取某IME等。
當你編寫自己的文字編輯器的時候,你要實現onCreateInputConnection(EditorInfo)以返回你的InputConnection的介面執行個體,用來允許IME和你的文本編輯域來互動。
IME(Input Methods)
一個IME(IME)是Service(服務)的實現,通常繼承自 InputMethodService。IME提供核心的 InputMethod介面,儘管提供InputMethod通常是由InputMethodService來處理,而IME的實現只需要處理更高層的API。
更多資訊參閱InputMethodService。
安全(Security)
IME關係到許多安全問題,因其基本不受約束地驅動UI並監視使用者輸入。AndroidIME架構還允許調度第三方IME,所必須小心以限制他們的選擇和相互作用。
以下是IMF背後安全架構的要點:
* 只允許系統訪問經BIND_INPUT_METHOD許可權許可訪問IME的InputMethod介面。通過綁定到要求這個許可權的服務來強制實現這一點。所以系統可以保證沒有不被信任的用戶端在它的控制之外訪問到當前的IME。
* IMF中可能有許多客戶進程,但在同一時間只有一個是啟用的。未啟用用戶端不能與IMF核心互動通過下述機制實現。
* IME用戶端只可訪問InputMethodSession介面。每個用戶端建立一個介面執行個體,只有與啟用客戶相關聯的會話的調用才會被IME處理。這點通過普通IME的 AbstractInputMethodService執行,必須由IME顯式的處理,而IME正是InputMethodSession的自訂實現。
* 只有啟用的InputConnection接受操作。IMF通知每個客戶進程是否啟用,IMF忽略非啟用進程對當前輸入聯結的調用。這確保了當前IME只將事件和文本編輯交付使用者可見焦點的UI。
* 一個IME永遠不能在螢幕關閉時與 InputConnection互動。這是通過當螢幕關閉時所有用戶端無效,並防止不良IME在使用者無法關注其行為時驅動UI。
* 客戶應用程式可以要求系統選取一個新的IME,但不能編程式選擇之一。這是避免惡意程式在使用者導航到其它應用程式時,選擇自己的IME並保持運行。也就是說,IME可以編程式的要求系統選擇其它IME,因它完全控制了使用者輸入。
使用者在可切換至一個新的IME前必須顯式的啟用它,以確認系統瞭解它,使其處於可用狀態。
三、常量
public static final int HIDE_IMPLICIT_ONLY
hideSoftInputFromWindow(IBinder, int)中的標誌,表示如果使用者未顯式地顯示軟鍵盤視窗,則隱藏視窗。
常量值: 1 (0x00000001)
public static final int HIDE_NOT_ALWAYS
hideSoftInputFromWindow(IBinder, int)中的標誌,表示軟鍵盤視窗總是隱藏,除非開始時以SHOW_FORCED顯示。
常量值: 2 (0x00000002)
public static final int RESULT_HIDDEN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標誌:軟鍵盤視窗從顯示切換到隱藏時的狀態。
常量值: 3 (0x00000003)
public static final int RESULT_SHOWN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標誌:軟鍵盤視窗從隱藏切換到顯示時的狀態。
常量值: 2 (0x00000002)
public static final int RESULT_UNCHANGED_HIDDEN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標誌:軟鍵盤視窗不變保持隱藏時的狀態。
常量值: 1 (0x00000001)
public static final int RESULT_UNCHANGED_SHOWN
showSoftInput(View, int, ResultReceiver)和hideSoftInputFromWindow(IBinder, int, ResultReceiver)中ResultReceiver結果代碼標誌:軟鍵盤視窗不變保持顯示時的狀態。
常量值: 0 (0x00000000)
public static final int SHOW_FORCED
showSoftInput(View, int)標誌,表示使用者強制開啟IME(如長按菜單鍵),一直保持開啟直至只有顯式關閉。
常量值: 2 (0x00000002)
public static final int SHOW_IMPLICIT
showSoftInput(View, int)標誌,表示隱式顯示輸入視窗,非使用者直接要求。視窗可能不顯示。
常量值: 1 (0x00000001)
四、公用方法
public void displayCompletions (View view, CompletionInfo[] completions)
(譯者註:IME自動完成)
public InputMethodSubtype getCurrentInputMethodSubtype ()
(譯者註:擷取當前IME類型?)
public List<InputMethodInfo> getEnabledInputMethodList ()
(譯者註:擷取已啟用IME列表?)
public List<InputMethodSubtype> getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)
public List<InputMethodInfo> getInputMethodList ()
(譯者註:擷取IME列表)
public Map<InputMethodInfo, List<InputMethodSubtype>> getShortcutInputMethodsAndSubtypes ()
public void hideSoftInputFromInputMethod (IBinder token, int flags)
關閉/隱藏IME軟鍵盤地區,使用者不再看到或與其互動。只能由當前啟用IME調用,因需令牌(token)驗證。
參數
token 在IME啟動時提供令牌驗證,驗證後可對其進行操作。
flags 提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS等位設定。
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags)
hideSoftInputFromWindow(IBinder, int, ResultReceiver)的無傳回值版:從視窗上下文中確定當前接收輸入的視窗,隱藏其IME視窗
參數
windowToken 由視窗請求View.getWindowToken()返回得到的令牌(token)。
flags 提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLY位設定。
public boolean hideSoftInputFromWindow (IBinder windowToken, int flags, ResultReceiver resultReceiver)
從視窗上下文中確定當前接收輸入的視窗,要求隱藏其軟鍵盤視窗。它可由使用者調用並得到結果而不僅僅是顯式要求IME視窗隱藏。
參數
windowToken 由視窗請求View.getWindowToken()返回得到的令牌(token)。
flags 提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLY位設定。
resultReceiver 如不為空白,當IME處理請求告訴你完成時調用。你收到的結果碼可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, 或RESULT_HIDDEN。
public void hideStatusIcon (IBinder imeToken)
(譯者註:隱藏狀態列表徵圖?)
public boolean isAcceptingText ()
當前服務視圖接受全文編輯返回真。沒有IME聯結為false,這時其只能處理原始按鍵事件。
public boolean isActive (View view)
視圖為當前輸入的啟用視圖時返回真。
public boolean isActive ()
IME中的任意視圖啟用時返回真。
public boolean isFullscreenMode ()
判斷相關IME是否以全螢幕模式運行。全屏時,完全覆蓋你的UI時,返回真,否則返回假。
public boolean isWatchingCursor (View view)
如當前IME要看到輸入編輯者的游標位置時返回真。
public void restartInput (View view)
如有IME聯結至視圖,重啟輸入以顯示新的內容。可在以下情況時調用此方法:視圖的文字導致IME外觀變化或有按鍵輸入資料流,如應用程式調用TextView.setText()時。
參數
view 文字發生變化的視圖。
public void sendAppPrivateCommand (View view, String action, Bundle data)
對當前IME調用 InputMethodSession.appPrivateCommand()。
參數
view 可選的發送命令的視圖,如你要發送命令而不考慮視圖附加到IME,此項可以為空白。
action 執行的命令名稱。必須是範圍的名稱,如首碼包名稱,這樣不同的開發人員就不會建立衝突的命令。
data 命令中包含的任何資料。
public boolean setCurrentInputMethodSubtype (InputMethodSubtype subtype)
(譯者註:此方法為3.0中新增的方法)
public void setInputMethod (IBinder token, String id)
強制切換到新IME組件。只能由持有token的應用程式(application)或服務(service) 調用當前啟用IME。
參數
token 在IME啟動時提供令牌驗證,驗證後可對其進行操作。
id 切換到新IME的唯一標識。
public void setInputMethodAndSubtype (IBinder token, String id, InputMethodSubtype subtype)
強制切換到一個新的IME和指定的類型。只能由持有token的應用程式(application)或服務(service) 調用當前啟用IME。(譯者註:此方法為3.0中新增的方法)
參數
token 在IME啟動時提供令牌驗證,驗證後可對其進行操作。
id 切換到新IME的唯一標識。
subtype 切換到新IME的新類型。
public void showInputMethodAndSubtypeEnabler (String topId)
(譯者註:此方法為3.0中新增的方法)
public void showInputMethodPicker ()
(譯者註:顯示IME菜單列表)
public boolean showSoftInput (View view, int flags, ResultReceiver resultReceiver)
如需要,顯式要求當前IME的軟鍵盤地區向使用者顯示。當使用者與視圖互動,使用者表示要開始執行輸入操作時,可以調用此方法。
參數
view 當前焦點視圖,可接受軟鍵盤輸入。
flags 提供額外的操作標誌。當前可以是0或SHOW_IMPLICIT 位設定。
resultReceiver 如不為空白,當IME處理請求告訴你完成時調用。你收到的結果碼可以是RESULT_UNCHANGED_SHOWN, RESULT_UNCHANGED_HIDDEN, RESULT_SHOWN, 或 RESULT_HIDDEN 。
public boolean showSoftInput (View view, int flags)
showSoftInput(View, int, ResultReceiver)的無傳回值版:如需要,顯式要求當前IME的軟鍵盤地區向使用者顯示。
參數
view 當前焦點視圖,可接受軟鍵盤輸入。
flags 提供額外的操作標誌。當前可以是0或SHOW_IMPLICIT 位設定。
public void showSoftInputFromInputMethod (IBinder token, int flags)
顯示IME的軟鍵盤地區,這樣使用者可以到看到IME視窗並能與其互動。只能由當前啟用IME調用,因需令牌(token)驗證。
參數
token 在IME啟動時提供令牌驗證,驗證後可對其進行操作。
flags 提供額外的操作標誌。可以是0或 SHOW_IMPLICIT, SHOW_FORCED位設定。
public void showStatusIcon (IBinder imeToken, String packageName, int iconId)
(譯者註:顯示狀態列表徵圖?)
public boolean switchToLastInputMethod (IBinder imeToken)
public void toggleSoftInput (int showFlags, int hideFlags)
(譯者註:切換軟鍵盤)
public void toggleSoftInputFromWindow (IBinder windowToken, int showFlags, int hideFlags)
本方法切換IME的視窗顯示。如輸入視窗已顯示,它隱藏。如無輸入視窗則顯示。
參數
windowToken 由視窗請求View.getWindowToken()返回得到的令牌(token)。
showFlags 提供額外的操作標誌。當前可以為0或 HIDE_IMPLICIT_ONLY位設定。
hideFlags 提供額外的操作標誌。可以是0或 HIDE_IMPLICIT_ONLY, HIDE_NOT_ALWAYS位設定。
public void updateCursor (View view, int left, int top, int right, int bottom)
返回視窗的當前游標位置。
public void updateExtractedText (View view, int token, ExtractedText text)
(譯者註:當內容變化時文字編輯器調用此方法,通知其新提取文本。)
public void updateSelection (View view, int selStart, int selEnd, int candidatesStart, int candidatesEnd)
返回當前選擇地區。
android如何調用顯示和隱藏系統預設的IME
1.調用顯示系統預設的IME
方法一、
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(m_receiverView(接受軟鍵盤輸入的視圖(View)),InputMethodManager.SHOW_FORCED(提供當前操作的標記,SHOW_FORCED表示強制顯示));
方法二、
InputMethodManager m=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); (這個方法可以實現IME在視窗上切換顯示,如果IME在視窗上已經顯示,則隱藏,如果隱藏,則顯示IME到視窗上)
2.調用隱藏系統預設的IME
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS); (WidgetSearchActivity是當前的Activity)
3.擷取IME開啟的狀態
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
boolean isOpen=imm.isActive();
isOpen若返回true,則表示IME開啟
1、//隱藏軟鍵盤
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(WidgetSearchActivity.this.getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
2、//顯示軟鍵盤,控制項ID可以是EditText,TextView
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).showSoftInput(控制項ID, 0);
3、不自動彈出鍵盤:
帶有EditText控制項的在第一次顯示的時候會自動獲得focus,並彈出鍵盤,如果不想自動彈出鍵盤,有兩種方法:
方法一:在mainfest檔案中把對應的activity設定
android:windowSoftInputMode="stateHidden" 或者android:windowSoftInputMode="stateUnchanged"。
方法二:可以在布局中放一個隱藏的TextView,然後在onCreate的時候requsetFocus。
注意TextView不要設定Visiable=gone,否則會失效
,可以在布局中放一個隱藏的TextView,然後在onCreate的時候requsetFocus。
注意TextView不要設定Visiable=gone,否則會失效
<TextView
android:id="@+id/text_notuse"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true" />
TextView textView = (TextView)findViewById(R.id.text_notuse);
textView.requestFocus();
Android軟鍵盤學習InputMethodManager
當我們在Android提供的EditText中單擊的時候,會自動的彈出軟鍵盤,其實對於軟鍵盤的控制我們可以通過InputMethodManager這個類來實現。我們需要控制軟鍵盤的方式就是兩種一個是像EditText那樣當發生onClick事件的時候出現軟鍵盤,還有就是當開啟某個程式的時候自動的彈出軟鍵盤。
View Code
這個InputMethodManager類裡面的toggleSoftInput方法的API中的解釋是:
This method toggles the input method window display. If the input window is already displayed, it gets hidden. If not the input window will be displayed.
這個方法在介面上切換IME的功能,如果IME出於現實狀態,就將他隱藏,如果處於隱藏狀態,就顯示IME。
而對於第二中方式進入Activity就自動顯示軟鍵盤,在一個定時器中,也就是在一個線程中執行,只不過是延遲2秒執行,原因是在onCreate函數中Android程式未將螢幕繪製完成。
Android(java)學習筆記115:Android InputMethodManagerIME簡介