web-dev-qa-db-ja.com

ボタンを押すと仮想キーボードを閉じる

Activity、ボタン、EditTextを含むListViewがあります。目的は、EditTextに検索画面を入力し、ボタンを押して、検索結果にこのリストを表示させることです。

これはすべて完全に機能していますが、仮想キーボードの動作はおかしいです。

EditTextをクリックすると、仮想キーボードが表示されます。仮想キーボードの「完了」ボタンをクリックすると、消えます。ただし、仮想キーボードの[完了]をクリックする前に検索ボタンをクリックすると、仮想キーボードはそのままで、削除できません。 「完了」ボタンをクリックしても、キーボードは閉じません。 [完了]ボタンが[完了]から矢印に変わり、表示されたままになります。

ご協力いただきありがとうございます

129
Andrew
mMyTextView.setOnEditorActionListener(new TextView.OnEditorActionListener() {
    public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
        if (actionId == EditorInfo.IME_ACTION_SEARCH) {
            // hide virtual keyboard
            InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(m_txtSearchText.getWindowToken(), 
                                      InputMethodManager.RESULT_UNCHANGED_SHOWN);
            return true;
        }
        return false;
    }
});
59
Andrew
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
                                     InputMethodManager.HIDE_NOT_ALWAYS);

onClick(View v)イベントの直後にこれを配置します。

インポートする必要がありますAndroid.view.inputmethod.InputMethodManager;

ボタンをクリックすると、キーボードが非表示になります。

298
Paul Maserrat

以下のコードを使用

your_button_id.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
        try  {
            InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
            imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);
        } catch (Exception e) {

        }
    }
});

EditViewにOnEditorActionListenerを実装する必要があります

public void performClickOnDone(EditView editView, final View button){
    textView.setOnEditorActionListener(new OnEditorActionListener() {

        @Override
        public boolean onEditorAction(EditView v, int actionId, KeyEvent event) {
            hideKeyboard();
            button.requestFocus();
            button.performClick();
            return true;
        }
    });

そして、次の方法でキーボードを非表示にします。

public void hideKeybord(View view) {
    inputMethodManager.hideSoftInputFromWindow(view.getWindowToken(),
                                  InputMethodManager.RESULT_UNCHANGED_SHOWN);
}

onClickListenerを使用してボタンに隠れているキーボードも起動する必要があります

これで、仮想キーボードとボタンの「完了」をクリックしても同じことが行われます。キーボードを非表示にしてクリック操作を実行します。

13
pixel

ボタンクリックイベント内に次のコードを追加します。

InputMethodManager inputManager = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
11
Ashana.Jackol

アクティビティの場合、

InputMethodManager imm = (InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), 0);

フラグメントの場合、getActivity()を使用します

getActivity()。getSystemService();

getActivity()。getCurrentFocus();

InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(getActivity().getCurrentFocus().getWindowToken(), 0);
8
Priya Rajan

編集テキストは1つしかないため、ボタンのクリック内でその編集テキストに対して実行されるアクションを呼び出すだけで、残りはシステムによって処理されます。エディットテキストが複数ある場合、最初にフォーカスされたエディットテキストを取得する必要があるため、これはそれほど効率的ではありません。しかし、あなたの場合、それは完全に動作します

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)
8
Laert

このソリューションは私に最適です:

private void showKeyboard(EditText editText) {
    editText.requestFocus();
    editText.setFocusableInTouchMode(true);
    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.showSoftInput(editText, InputMethodManager.RESULT_UNCHANGED_SHOWN);
    editText.setSelection(editText.getText().length());
}

private void closeKeyboard() {
    InputMethodManager inputManager = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
    inputManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), InputMethodManager.RESULT_UNCHANGED_SHOWN);
}
7

これを試して...

  1. キーボードを表示するため

    editText.requestFocus();
    InputMethodManager imm = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
    
  2. キーボードを隠す

    InputMethodManager inputManager = (InputMethodManager) ctx.getSystemService(Context.INPUT_METHOD_SERVICE); 
    inputManager.toggleSoftInput(InputMethodManager.HIDE_IMPLICIT_ONLY, 0);
    
3
Affa Musaffa
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}
1

ボタンクリックイベントでこのコードを使用します

// Check if no view has focus:
View view = this.getCurrentFocus();
if (view != null) {  
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
0
Pankaj Talaviya

クラッシュヌルポイントの例外の修正:ユーザーがボタンをクリックしてもキーボードが開かない場合がありました。 getCurrentFocus()がnullでないことを確認するには、ifステートメントを記述する必要があります。

            InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
        if(getCurrentFocus() != null) {
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
0
CacheMeOutside

Kotlinの例:

val inputMethodManager = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager

フラグメントから:

inputMethodManager.hideSoftInputFromWindow(activity?.currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)

アクティビティから:

inputMethodManager.hideSoftInputFromWindow(currentFocus?.windowToken, InputMethodManager.HIDE_NOT_ALWAYS)
0
norbDEV