Android 輸入法彙總

一、結構包名
android.view.inputmethod.InputMethodManager

二、類概述

  整個輸入法框架(IMF)結構的核心API,應用程序之間進行調度和當前輸入法交互。你可以用Context.getSystemService()取得這一接口的實例。

  架構總述(Architecture Overview)

  輸入法框架(IMF)共有三個主要部分:

  * 輸入法管理器,管理各部分的交互。它是一個客戶端API,存在於各個應用程序的context中,用來溝通管理所有進程間交互的全局系統服務。

  * 輸入法(IME) ,實現一個允許用戶生成文本的獨立交互模塊。系統綁定一個當前的輸入法。使其創建和生成,決定輸入法何時隱藏或者顯示它的UI。同一時間只能有一個IME運行。

  * 客戶應用程序,通過輸入法管理器控制輸入焦點和IME的狀態。一次只能有一個客戶端使用IME。

  應用程序(Applications)

  大多數情況下,使用標準TextView或其子類的應用程序只要做少量工作就可以讓軟鍵盤(soft input methods)正常工作。你要注意的是:

  * 正確設置你的可編輯文本視圖inputType,這樣輸入法有足夠的上下文幫助用戶向其輸入文本。

  * 當輸入法顯示時妥善處理隱藏屏幕空間。理想的情況下應用程序應處理窗口變小,如必要你可以利用系統執行平移窗口。你應在活動(activity)中設置windowSoftInputMode屬性或調整創建窗口的相應值,以便系統決定平移或縮放(它會嘗試自動調整但可能出錯)。

  * 你還可以通過相同的windowSoftInputMode控制窗口的首選軟鍵盤狀態(打開、關閉等)。

  通過API可以與IMF及其IME交互實現更細緻的控制,如顯示或輸入區域,用戶選取某輸入法等。

  當你編寫自己的文本編輯器的時候,你要實現onCreateInputConnection(EditorInfo)以返回你的InputConnection的接口實例,用來允許IME和你的文本編輯域來交互。

   輸入法(Input Methods):一個輸入法(IME)是Service(服務)的實現,通常繼承自 InputMethodService。IME提供核心的 InputMethod接口,儘管提供InputMethod通常是由InputMethodService來處理,而IME的實現只需要處理更高層的API。輸入法關係到許多安全問題,因其基本不受約束地驅動UI並監視用戶輸入。Android輸入法框架還允許調度第三方IME,所必須小心以限制他們的選擇和相互作用。
以下是IMF背後安全架構的要點:1、 只允許系統訪問經BIND_INPUT_METHOD權限許可訪問IME的InputMethod接口。通過綁定到要求這個權限的服務來強制實現這一點。所以系統可以保證沒有不被信任的客戶端在它的控制之外訪問到當前的輸入法。2、IMF中可能有許多客戶進程,但在同一時間只有一個是激活的。未激活客戶端不能與IMF核心交互通過下述機制實現。3、 輸入法客戶端只可訪問InputMethodSession接口。每個客戶端創建一個接口實例,只有與激活客戶相關聯的會話的調用纔會被IME處理。這點通過普通IME的 AbstractInputMethodService執行,必須由IME顯式的處理,而IME正是InputMethodSession的自定義實現。4、 只有激活的InputConnection接受操作。IMF通知每個客戶進程是否激活,IMF忽略非激活進程對當前輸入聯接的調用。這確保了當前IME只將事件和文本編輯交付用戶可見焦點的UI。5、 一個IME永遠不能在屏幕關閉時與 InputConnection交互。這是通過當屏幕關閉時所有客戶端無效,並防止不良IME在用戶無法關注其行爲時驅動UI。6、 客戶應用程序可以要求系統選取一個新的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)標誌,表示用戶強制打開輸入法(如長按菜單鍵),一直保持打開直至只有顯式關閉。 常量值: 2 (0x00000002)

    public static final int SHOW_IMPLICIT, showSoftInput(View, int)標誌,表示隱式顯示輸入窗口,非用戶直接要求。窗口可能不顯示。常量值: 1 (0x00000001)

四、公共方法

    public void displayCompletions (View view, CompletionInfo[] completions)(譯者注:輸入法自動完成)

    public InputMethodSubtype getCurrentInputMethodSubtype ()(譯者注:獲取當前輸入法類型?)

    public List getEnabledInputMethodList ()(譯者注:獲取已啓用輸入法列表?)

    public List getEnabledInputMethodSubtypeList (InputMethodInfo imi, boolean allowsImplicitlySelectedSubtypes)

    public List getInputMethodList ()(譯者注:獲取輸入法列表)

    public Map

public class InputMethodManagerTest extends Activity implements OnClickListener{  
    private Button button;  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        // TODO Auto-generated method stub  
        super.onCreate(savedInstanceState);  
        LinearLayout layout=new LinearLayout(this);  
        LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);  
        button=new Button(this);  
        button.setId(123);  
        button.setText("Hello GaoMatrix");  
        button.setOnClickListener(this);  
        layout.addView(button, layoutParams);  
        setContentView(layout);  

        /** 
         * 用一個定時器控制當打開這個Activity的時候就出現軟鍵盤 
         */  
        Timer timer=new Timer();  
        timer.schedule(new TimerTask() {  
            @Override  
            public void run() {  
                InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
                inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);  
            }  
        }, 2000);  
    }  
    /** 
     * 當單擊事件的時候觸發顯示軟鍵盤 
     */  
    @Override  
    public void onClick(View v) {  
        InputMethodManager inputMethodManager=(InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
        inputMethodManager.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);  
    }  
}  

這個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.

這個方法在界面上切換輸入法的功能,如果輸入法出於現實狀態,就將他隱藏,如果處於隱藏狀態,就顯示輸入法。

而對於第二中方式進入Activity就自動顯示軟鍵盤,在一個定時器中,也就是在一個線程中執行,只不過是延遲2秒執行,原因是在onCreate函數中Android程序未將屏幕繪製完成。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章