ボタンを押したときに仮想キーボードを閉じる


133

私が持っているActivityEditText、ボタンとListView。目的は、に検索画面を入力しEditText、ボタンを押して、検索結果にこのリストを表示させることです。

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

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

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

回答:


304
InputMethodManager inputManager = (InputMethodManager)
                                  getSystemService(Context.INPUT_METHOD_SERVICE); 

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

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

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

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


55
注:(フォーカスがない可能性のあるインスタンスでこのメソッドを使用する場合(例:onPause()など): inputManager.hideSoftInputFromWindow((null == getCurrentFocus()) ? null : getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
Peter Ajtai

5
コンテキストもインポートする必要があります。
Si8 2013

4
注意:キーボードがすでに非表示になっている場合は、NPEをスローします。これを回避するには、Peterのコメントに従ってください。
Don Larynx、2015年

無関係なボタンをクリックした後にキーボードが表示されるのはなぜですか?誰かが何らかの説明やリンクを提供できますか?
kommradHomer 2016年

1
魅力的な作品!
ARiF 2016

59
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;
    }
});

わたしにはできる。ありがとう!
Aman Goyal

29

以下のコードを使用

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) {

        }
    }
});

2
単純なnullチェックの代わりに例外をキャッチしますか?
Glass博士

私のために働いて、ボタンのクリックでキーボードを非表示にします
ashishdhiman2007

必要なものに対する簡単な解決策:検索ボタンをクリックした後でキーボードを非表示にする。
dawoodman71

13

OnEditorActionListenerEditView を実装する必要があります

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

仮想キーボードとボタンで[完了]をクリックすると、同じことが行われます-キーボードを非表示にして、クリックアクションを実行します。


すばらしいですが、私はあまりフォローしていません。私は投稿がコードの一部を食べ​​たと思います(サンプルでは「public void」の後には何もありません)。アクティビティのonCreateメソッドでsetOnEditorActionListnerを試行しましたが、setOnEditorActionListenerが何であるかわかりません。「匿名の内部タイプ」通知を受け取ります。(私は私のアクティビティonCreateメソッドでこれを行っています) i37.tinypic.com/6ozkig.png
Andrew

1
このコードにはいくつかの間違いがあるようですが、それは正しい考えです。1つには、OnEditorActionListenerインターフェースは内部クラスであるため、明示的にインポートする(この場合、Eclipseはこれを行わない)か、として参照する必要がありTextView.OnEditorActionListenerます。
MatrixFrog 2010

少し困っています。onEditorActionListener(パブリッククラスSearchActivity extends ListActivity implements OnClickListener、OnEditorActionListener)を実装し、リスナーをEditText(mSearchText.setOnEditorActionListener(this);)にアタッチしましたが、EclipseではonEditorActionハンドラーをオーバーライドできません(public boolean onEditorAction (TextView v、int actionId、KeyEventイベント))。それはスーパークラスのメソッドをオーバーライドする必要があると述べています。何か案は?
Andrew

こんにちは、yourEditView.setOnEditorActionListener(new OnEditorActionListener(){....
pixel

11

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

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

1
魅力的な作品!
coderpc 2017

10

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

myedittext.onEditorAction(EditorInfo.IME_ACTION_DONE)

1
他の人がソリューションを理解して学ぶことができるように、ソリューションが機能する理由の説明を残していただけますか ありがとう!
Shawn

確かにショーン。トップを編集しました。ポーズが
不明確

これは最もエレガントな方法の1つだと私を信じてください。ありがとう@Laert
WitVault

9

アクティビティについては、

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);

7

このソリューションは私にとって完璧に機能します:

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);
}

3

これを試して...

  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);

「隠すためのキーボード」法はtoogle(非表示が表示されている場合、表示される場合が隠されている)ではない非表示であり、
ニンジャコーディング

1
View view = this.getCurrentFocus();
if (view != null) {
InputMethodManager imm =(InputMethodManager)this.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);enter code here}

こんにちは!この回答は@Andrewのニーズを十分に満たす可能性がありますが、説明を付けて拡張できれば、将来の読者が最大限に利益を得られるようにするために、それは素晴らしいことです。
derM 2017年

1

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

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

// 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

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

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

-2

を設定するandroid:singleLine="true"と、ボタンが自動的にキーボードを非表示にします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.