2011-02-02 71 views
4

我在一個活動中有三個EditText框,其中兩個常規輸入法(硬鍵,默認軟鍵盤)都可以。但是對於其中一個EditText框,我只想從自定義鍵盤視圖發送軟輸入。所以實際上我希望默認的軟鍵盤永遠不會顯示這個EditText。我試着加入onTouchListeners和onFocusChange偵聽器的EditText有部分成功是這樣的:Android:如何永久&完全不顯示EditText的默認軟鍵盤?

public boolean onTouch(View v, MotionEvent event) { 
    v.requestFocus(); 
    imm.toggleSoftInput(0, 0); 
    return true; 
} 

public void onFocusChange(View v, boolean hasFocus) { 
    InputMethodManager imm = (InputMethodManager)context.getSystemService(Context.INPUT_METHOD_SERVICE); 
    if (imm.isActive(v)) { 
     imm.toggleSoftInput(0,0); 
    } 
} 

但我還沒有得到一個明確的解決方案,因爲

1)默認的軟鍵盤之前,總是短暫閃爍可見偵聽器隱藏它

2)在某些情況下,如移動焦點與硬鍵盤箭頭鍵的EditText有時設置默認軟鍵盤可見

等。

所以我很想找到一個簡單的方法來告訴Android永遠不會顯示此特定EditText的默認軟鍵盤。我不想擴展EditText並開始重寫內容,因爲EditText功能對我來說是完美的 - 我只想讓默認的軟鍵盤不顯示。

我花了幾天的時間試圖弄清楚這一點。通過谷歌發現的一些主題(包括一些在這裏)有這個問題的中途嘗試,但到目前爲止,我還沒有找到一個完全功能的解決方案。

編輯:

我真的開始惱火了。我決定我可以儘量不要使用EditText,但是可以完成任務的任何其他視圖。事實證明,它很難擺脫那個軟鍵盤。甚至當我使用硬鍵將焦點從EditText移動到Button時,它就會顯示出來!爲什麼地球上的軟鍵盤應該顯示在每個有焦點的怪異視圖上?即使當我明確地說inputType =「無」?如何將*軟鍵盤關閉?下面是按鈕的XML - 讓我們用它作爲一個例子:

<Button 
    android:id="@+id/OkButton" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:inputType="none" 
    android:paddingRight="5mm" 
    android:paddingLeft="5mm" 
    android:layout_below="@id/Volume" 
    android:layout_alignParentLeft="true" 
    android:text="OK"/> 

EDIT2:

我有如何實現的,似乎工作的解決方案。首先,我得到了InputMethodManager的保持:

this.imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); 

和我設置OnClickListener,OnTouchListener和OnFocusChange監聽所有調用下面的方法時,我想的EditText要突出重點,我的自定義KeyboardView可見,同時隱藏默認的軟輸入:

private boolean makeActive(View v) { 
    imm.hideSoftInputFromWindow(v.getWindowToken(), 0); 
    EditText e = (EditText) v; 
    int iType = e.getInputType(); 
    e.setInputType(InputType.TYPE_NULL); 
    e.requestFocus(); 
    showKb(); 
    e.setInputType(iType); 
    return true; 
} 
+1

@zenperttu:「但對於的EditText上盒一個我只想從一個自定義鍵盤視圖發送軟輸入」 - 那麼不要讓它成爲`EditText`。無論您的IME問題如何,您的用戶都會在Market上爲您提供一星評級,表明您的應用已損壞,如果您將某些內容看作「EditText」,但卻不像「EditText」那樣行事(例如,允許用戶做一些愚蠢的事情,比如編輯文本)。 – CommonsWare 2011-02-02 21:45:08

+0

@CommonsWare:我不希望阻止用戶在EditText中輸入/編輯文本。我接受硬鍵,並將顯示EditText的自定義鍵盤視圖,該視圖控制用戶可以輸入的字符,就像爲EditText設置輸入類型時一樣,例如在預期輸入數字時,字母不會顯示在軟鍵盤。現在只有沒有現成的Android輸入類型和相應的鍵盤佈局可用。更具體地說,我的自定義鍵盤佈局將只顯示SI公制系統中指定的一些符號,包括希臘字符。 – zenperttu 2011-02-03 06:38:48

回答

0
((InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE)) 
     .hideSoftInputFromWindow(searchBox.getWindowToken(), 0); 

其中搜索盒是你的文本框或更好,而不是搜索盒讓你的當前窗口。

或者試試:

InputMethodManager imm = (InputMethodManager)getBaseContext() 
    .getSystemService(Context.INPUT_METHOD_SERVICE); 
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED,InputMethodManager.HIDE_IMPLICIT_ONLY); 

其中上下文getApplicationContext();

相關問題