web-dev-qa-db-ja.com

Android SearchView?

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

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

55
CACuzcatlan

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

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;
}
66
bkurzius

シンプルで、まっすぐに、きれいに:

  @Override
  public boolean onQueryTextSubmit(String query) {
      // your search methods
      searchView.clearFocus();
      return true;
  }
33
dazito

以下のようにonQueryTextSubmitでfalseを返すだけです

@Override
public boolean onQueryTextSubmit(String s) {
     return false;
}
20
Plugie

あなたが電話すれば何とか動作します

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

その後

otherWidget.requestFocus();
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;
            }
        });
7
Till

私にとっては、次のように動作します:

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

_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はそれを実行し、キーボードも削除しません。実際、ソースコードの十分な深さまで掘り下げて同じことになるとyukuは示唆しましたが、これらの低レベルのものをいじる必要がないので、私のソリューションがより気に入っています。

7
Ridcully

編集:私は上により良いソリューションを追加しましたが、参考として古い答えも保持しました。

 @Override
        public boolean onQueryTextSubmit(String query) {

                  searchView.clearFocus();
            return false;
        }

元の回答:setOnQueryTextListenerを使用してプログラミングしました。サーチビューが非表示になるとキーボードが消え、再び表示されるとキーボードがポップアップしなくなります。

    //set query change listener
     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener(){
        @Override
        public boolean onQueryTextChange(String newText) {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean onQueryTextSubmit(String query) {
            /**
             * hides and then unhides search tab to make sure keyboard disappears when query is submitted
             */
                  searchView.setVisibility(View.INVISIBLE);
                  searchView.setVisibility(View.VISIBLE);
            return false;
        }

     });
3
Parnit

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

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

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

1
Jose_GD

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

それが役に立てば幸い。

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;
    }
}
1
Mert TUTSAK

以下のコードは、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;
                        }
                    });
0
Ankita Shah

なぜこれを試してみませんか? Xボタンをタッチすると、どのような場合でも検索ビューにフォーカスが移ります。

ImageView closeButton = (ImageView)searchView.findViewById(R.id.search_close_btn);
        closeButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText et = (EditText) findViewById(R.id.search_src_text);
                et.setText("");`enter code here`
                searchView.setQuery("", false);
                searchView.onActionViewCollapsed();
                menuSearch.collapseActionView();
            }
        });

私のために働いた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);
 }
0
Jorgesys