簡體   English   中英

如何關閉Android軟鍵盤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM