70

ActionBar に searchView があります。ユーザーが入力を完了したら、キーボードを閉じたい。searchView に次の queryTextListener があります

final SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
    @Override 
    public boolean onQueryTextChange(String newText) { 
        // Do something 
        return true; 
    } 

    @Override 
    public boolean onQueryTextSubmit(String query) {

        showProgress();
        // Do stuff, make async call

        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        return true; 
    } 
};

同様の質問に基づいて、次のコードはキーボードを閉じる必要がありますが、この場合は機能しません。

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

私も試しました:

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

どちらも機能しません。これが Honeycomb 固有の問題なのか、ActionBar の searchView に関連しているのか、あるいはその両方なのかはわかりません。誰かがこれを機能させたことがありますか、またはなぜ機能しないのか知っていますか?

4

16 に答える 16

71

私は似たようなことをしようとしていました。SearchActivity別のものから起動Activityし、開いた検索フィールドが読み込まれたときに検索語が表示されるようにする必要がありました。上記のすべてのアプローチを試しましたが、最終的に (上記の Ridcully の回答と同様に) に変数を設定し、ユーザーが新しい検索を送信したときにSearchViewinonCreateOptionsMenu()onQueryTextSubmit()呼び出しclearFocus()ました。SearchView

private SearchView searchView;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.search_menu, menu);
    searchView = (SearchView) menu.findItem(R.id.menu_search)
            .getActionView(); // set the reference to the searchView
    searchView.setOnQueryTextListener(this); 
    searchMenuItem = (MenuItem) menu.findItem(R.id.menu_search); 
    searchMenuItem.expandActionView(); // expand the search action item automatically
    searchView.setQuery("<put your search term here>", false); // fill in the search term by default
    searchView.clearFocus(); // close the keyboard on load
    return true;
}

@Override
public boolean onQueryTextSubmit(String query) {
    performNewSearch(query);
    searchView.clearFocus();
    return true;
}
于 2013-02-28T04:02:17.567 に答える
11

電話すればなんとかなる

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

その後

otherWidget.requestFocus();
于 2012-01-10T09:10:57.087 に答える
11

私にとって、上記のどれも最初の送信で機能していませんでした。隠れていて、すぐにキーボードを再表示していました。ビューのハンドラーに投稿しclearFocus()て、他のすべての処理が完了した後にそれを実現する必要がありました。

mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                if (!"".equals(query)) {
                    mSearchView.post(new Runnable() {
                        @Override
                        public void run() {
                            mSearchView.clearFocus();
                        }
                    });
                }
                return true;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
于 2015-12-08T17:41:16.887 に答える
7

私にとっては、次のように機能します。

私の活動にはメンバー変数があります

private SearchView mSearchView;

そのonCreateOptionsMenu()変数を次のように設定します。

public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.library, menu);
    mSearchView = (SearchView)menu.findItem(R.id.miSearch).getActionView();
    mSearchView.setOnQueryTextListener(this);
    return true;
}   

QueryTextListener最後に、私はこれを行います:

mSearchView.setQuery("", false);
mSearchView.setIconified(true); 

SearchView のソース コードを確認しました。クエリ テキストを空の文字列にリセットしない場合、SearchView はそれを行うだけで、キーボードも削除しません。実際、ソース コードを十分に深く掘り下げると、結果は同じになります。

于 2012-03-01T11:18:13.477 に答える
1

私は ActionBarSherlock 4.3 を使用し、ProgressDialog を持っています。postExecute メソッドでそれを閉じると、Searchview にフォーカスが移ります。それを修正するには:

//Handle intent and hide soft keyboard
    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
        handleIntent(intent);
        searchView.setQuery("", false);
        searchView.setIconified(true);
        searchView.clearFocus();
    }

    /*When dismiss ProgressDialog, searchview gain focus again and shows the keyboard. I  call clearFocus() to avoid it.*/

    AsyncTask.onPostExecute(){
      if(pd!=null)
        pd.dismiss();
      if(searchView!=null)
        searchView.clearFocus();
    }

それが役に立てば幸い。

于 2013-06-12T14:57:03.880 に答える
1

あなたはそれを使用することができます。

if (isKeybordShowing(MainActivity.this, MainActivity.this.getCurrentFocus())) {
    onBackPressed();
}

public boolean isKeybordShowing(Context context, View view) {
    try {
        InputMethodManager keyboard = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
        keyboard.hideSoftInputFromWindow(view.getWindowToken(), 0);
        return keyboard.isActive();
    } catch (Exception ex) {
        Log.e("keyboardHide", "cannot hide keyboard", ex);
        return false;
    }
}
于 2019-04-07T21:52:36.657 に答える
1

デュアル ペイン アクティビティで作業しているタブレット アプリでは、

f.getView().requestFocus(); // f is the target fragment for the search

検索後にソフトキーボードを閉じるにはそれで十分でした。InputMethodManager を使用する必要はありません

于 2012-07-08T06:07:21.040 に答える
0

私のために働いた2つのソリューション、最初のものはSearchViewインスタンスを使用しています:

private void hideKeyboard(){
    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
    imm.hideSoftInputFromWindow(searchView.getWindowToken(), 0);
}

2番目の解決策:

private void hideKeyboard(){
            InputMethodManager inputManager = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); 
            inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
 }
于 2015-11-04T22:59:04.220 に答える
0

以下のコードは、Searchviewでキーボードを非表示にするために機能しています

MenuItem searchItem = baseMenu.findItem(R.id.menuSearch);

edtSearch= (EditText) searchItem.getActionView().findViewById(R.id.search_src_text);

MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
                        @Override
                        public boolean onMenuItemActionExpand(MenuItem item) {
                            edtSearch.post(new Runnable() {
                                @Override
                                public void run() {
                                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                                    imm.hideSoftInputFromWindow(searchEditText.getWindowToken(), 0);
                                }
                            });
                            return true;
                        }

                        @Override
                        public boolean onMenuItemActionCollapse(MenuItem item) {
                            return true;
                        }
                    });
于 2016-12-29T10:02:19.433 に答える