做安卓開發(fā)的時候,會有各種各樣的想法和疑問,例如:怎么對軟鍵盤關閉或者怎么對軟鍵盤隱藏?
問題
我的布局中有一個EditText和一個Button
在編輯字段中寫入并單擊 后Button,我想在觸摸鍵盤外部時隱藏虛擬鍵盤。我認為這是一段簡單的代碼,但是在哪里可以找到它的示例?
解決方法
為了澄清這種瘋狂行為,我首先代表所有 Android 用戶對 Google 對軟鍵盤的徹底荒謬的處理表示歉意。對于同一個簡單的問題,之所以有這么多不同的答案,是因為這個 API 和 Android 中的許多其他 API 一樣,設計得很糟糕。我想不出有什么禮貌的方式來表達它。
我想隱藏鍵盤。我期望向Android提供以下聲明:Keyboard.hide()。結束。非常感謝。但安卓有一個問題。您必須使用InputMethodManager來隱藏鍵盤。好吧,好吧,這是 Android 的鍵盤 API。但!您需要擁有Context才能訪問 IMM?,F(xiàn)在我們有一個問題。我可能想從沒有使用或不需要任何Context. 或者更糟糕的是,IMM 要求您指定要隱藏鍵盤的內(nèi)容View(或者更糟糕的是,指定要隱藏的內(nèi)容)。Window
這就是隱藏鍵盤如此具有挑戰(zhàn)性的原因。親愛的谷歌:當我查找蛋糕的食譜時,RecipeProvider地球上沒有人會拒絕向我提供食譜,除非我首先回答誰會吃蛋糕以及在哪里吃蛋糕!
這個悲傷的故事以丑陋的事實結束:要隱藏 Android 鍵盤,您將需要提供 2 種形式的標識: aContext以及 aView或 a Window。
我創(chuàng)建了一個靜態(tài)實用方法,只要您從Activity.
public static void hideKeyboard(Activity activity) { InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE); //找到當前聚焦的視圖,這樣我們就可以從中獲取正確的窗口令牌。 View view = activity.getCurrentFocus(); //如果當前沒有視圖具有焦點,則創(chuàng)建一個新視圖,這樣我們就可以從中獲取窗口令牌 if (view == null) { view = new View(activity); } imm.hideSoftInputFromWindow(view.getWindowToken(), 0); }
請注意,此實用方法僅在從Activity!調(diào)用時才有效。上述方法調(diào)用getCurrentFocus目標Activity來獲取正確的窗口令牌。
EditText但是假設您想對托管在 a 中的主機隱藏鍵盤DialogFragment?您不能使用上面的方法:
hideKeyboard(getActivity()); //行不通
這是行不通的,因為您將傳遞對Fragment的 host 的引用Activity,而顯示 時主機將沒有焦點控制Fragment!哇!因此,為了隱藏片段中的鍵盤,我采用了較低級別、更常見且更丑陋的方法:
public static void hideKeyboardFrom(Context context, View view) { InputMethodManager imm = (InputMethodManager) context.getSystemService(Activity.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); }
以下是從浪費更多時間來追求此解決方案中收集到的一些附加信息:
關于windowSoftInputMode
還有一個爭論點需要注意。默認情況下,Android 會自動將初始焦點分配EditText給Activity. 很自然地,InputMethod(通常是軟鍵盤)將通過顯示自身來響應焦點事件。windowSoftInputMode當中的屬性設置AndroidManifest.xml為 時stateAlwaysHidden,指示鍵盤忽略此自動分配的初始焦點。
<activity android:name=".MyActivity" android:windowSoftInputMode="stateAlwaysHidden"/>
幾乎令人難以置信的是,當您觸摸控件時,它似乎沒有采取任何措施阻止鍵盤打開(除非focusable="false"和/或focusableInTouchMode="false"被分配給控件)。顯然,windowSoftInputMode設置僅適用于自動焦點事件,不適用于觸摸事件觸發(fā)的焦點事件。
因此,stateAlwaysHidden這個名字確實很糟糕。也許應該改為調(diào)用它ignoreInitialFocus。
更新:獲取窗口令牌的更多方法
如果沒有聚焦視圖(例如,如果您剛剛更改了片段,則可能會發(fā)生),還有其他視圖將提供有用的窗口令牌。
這些是上述代碼的替代方案,if (view == null) view = new View(activity); 它們沒有明確引用您的活動。
在片段類中:
view = getView().getRootView().getWindowToken();
給定一個片段fragment作為參數(shù):
view = fragment.getView().getRootView().getWindowToken();
從您的內(nèi)容主體開始:
view = findViewById(android.R.id.content).getRootView().getWindowToken();
更新 2:清除焦點以避免在從后臺打開應用程序時再次顯示鍵盤
將此行添加到方法的末尾:文章來源:http://www.zghlxwxcb.cn/article/423.html
view.clearFocus();
文章來源地址http://www.zghlxwxcb.cn/article/423.html
到此這篇關于如何以編程方式關閉/隱藏 Android 軟鍵盤?的文章就介紹到這了,更多相關內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!