[英]How to close the Android Soft Keyboard
我有一個類似表格的對話框。 軟鍵盤在用戶單擊 EditText 時打開。 然后就不會go走了。
當用戶從 EditText 移動到下一部分,單擊 Spinner 或 Button 或 RadioButton 時,如何關閉鍵盤?
如何關閉鍵盤
關閉軟鍵盤的代碼是這樣的:
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
你可以把它變成一個實用程序 function,然后在你的應用程序中靜態調用它:(取自這個非常好的答案: https://stackoverflow.com/a/17789187 )
// Close keyboard. Wont work if an EditText has focus.
public static void hideKeyboard(Activity activity) {
InputMethodManager imm = (InputMethodManager) activity.getSystemService(Activity.INPUT_METHOD_SERVICE);
//Find the currently focused view, so we can grab the correct window token from it.
View view = activity.getCurrentFocus();
//If no view currently has focus, create a new one, just so we can grab a window token from it
if (view == null) {
view = new View(activity);
}
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
在哪里關閉鍵盤
關於失去焦點? 不。
調用代碼以關閉軟鍵盤的合理位置是附加到 EditText 的 onFocus 偵聽器。 然后在 EditText 失去焦點時關閉鍵盤
但是,EditText 不會放棄按鈕、微調器或單選按鈕的焦點。 那些其他 UI 元素需要使用requestFocusFromTouch()
明確請求焦點。
讓其他 UI 元素在單擊時調用requestFocusFromTouch()
然后 EditText 在失去焦點時關閉鍵盤是行不通的。 當 EditText獲得焦點時,鍵盤不會關閉。 當 EditText沒有焦點時,它不再具有關閉鍵盤的權限。 諷刺的是,我知道。
只有當前獲得焦點的視圖才能關閉鍵盤。
將焦點放在不需要鍵盤的 UI 元素上,不會關閉鍵盤; 它只是更新它。 例如,如果 EditText 有一個數字鍵盤,單擊請求焦點的按鈕后,將出現一個字母數字鍵盤。
觸摸按鈕? 是的。
您可以將觸摸偵聽器添加到其他 UI 元素甚至布局。 例如,Spinner 可以嘗試關閉鍵盤:
// Close keyboard on touch. Wont work if Edit text has focus.
mSpinner.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
InputMethodManager imm=(InputMethodManager)getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(mEditText.getWindowToken(), 0);
return false;
}
}) ;
但是,EditText 可能仍然具有焦點並且不會讓您關閉該鍵盤。
新點擊的按鈕/微調器/收音機/等需要請求焦點並關閉鍵盤。 作為 static util function 它看起來像這樣:
// add touch listener to given view. On touch, request focus, then close keyboard
public static void hideKeyboardOnTouch(View view, Activity activity){
Context app = activity.getApplicationContext();
view.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
v.requestFocusFromTouch();
InputMethodManager imm=(InputMethodManager)app.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
return false;
}
}) ;
}
對於所有其他按鈕、單選按鈕、微調器等。當您設置它們時,您也會添加它。 例如:
radioA = view.findViewById(R.id.radio_a);
radioA.setChecked(myBooleanValueHere);
Utils.hideKeyboardOnTouch(radioA, getActivity()); // <-- close keyboard on touch
radioA.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// whatever should happen when this radio button is selected
}
});
請注意,我的示例在對話框中。 如果在 Activity 中,您將使用this
而不是getActivity()
。
您還可以讓按鈕/微調器/等請求焦點,然后在其 onClick 功能上關閉鍵盤。 我之所以選擇這種方法,是因為它可以非常一致地用於微調器、布局以及我可能沒有定義 onClick 的任何其他內容。
希望這會有所幫助! 而且我可以避免有人像我一樣找到所有這些東西:))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.