2016-05-04 13 views
10

私は単一のアクティビティを使用してSearchViewを表示し、検索結果を表示しています。検索結果は単なる項目のサブセットなので、検索はフィルタとして機能します。 SearchViewの戻るボタンをクリックしたときに、ビュー内のすべてのアイテムを復元する方法がわからないことを除いて、すべて正常に動作しているようです。SearchViewの戻るボタンを検出するには?

また、ユーザーが検索結果から前のビュー(私の場合は同じビュー)にナビゲートしたときを検出する別の方法があります。

おかげ

+0

はここhttp://stackoverflow.com/questions/25842555/how-to-handle-back-button-of-search-viewをご覧ください-in-android –

+1

Matei Radu、th3pat3Iの回答を拡大するなど、必要なすべての情報を提供してくれてありがとう。 – bdristan

+1

@bdristan私は自分の答えを更新した後、@MateiRaduが 'SearchView'のオープン/クローズを聞いて正しい答えをあなたに提供したことがわかりました。しかし、私の答えがまだ役に立ったと思っています。なぜそれがもううまくいかないのかについての説明があるからです。 – Darwind

答えて

24

だからあなたの質問のタイトルを見て、あなたはSearchViewが閉じているときに検出する方法がわからないので、あなたは、「正常」な状態ときに、あなたの意見を復元することはできませんSearchViewはもう開いていません。このように、あなたのSearchViewSearchView.OnCloseListener::(簡単な)ソリューション

のAndroid 4.0以降のよう

古いソリューションを追加することです

SearchView.setOnCloseListener(new SearchView.OnCloseListener() { 
    @Override 
    public boolean onClose() { 
     // This is where you can be notified when the `SearchView` is closed 
     // and change your views you see fit. 
    } 
}); 

EDIT

Android 4.0以降で動作する更新されたソリューション

明らかにOnCloseListenerはバグがあり、新しいバージョンのAndroid(4.0以降)では動作しません。参照:https://code.google.com/p/android/issues/detail?id=25758

これに対する解決策は、SearchViewのサポートライブラリのバージョンを使用することです:

マイonCreateOptionsMenuはこのようになります:Googleがさえ書くこと気にしなかった理由については

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.menu, menu); 

    MenuItem searchMenuItem = menu.findItem(R.id.searchView); 
    SearchView searchView = (SearchView) searchMenuItem.getActionView(); 

    MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() { 
     @Override 
     public boolean onMenuItemActionExpand(MenuItem item) { 
      Toast.makeText(ScrollingActivity.this, "onMenuItemActionExpand called", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 

     @Override 
     public boolean onMenuItemActionCollapse(MenuItem item) { 
      Toast.makeText(ScrollingActivity.this, "onMenutItemActionCollapse called", Toast.LENGTH_SHORT).show(); 
      return true; 
     } 
    }); 
} 

私が知らないドキュメントのコメントですが、悲しいです。

EDIT2:これはまた、代わりにOnCloseListenerOnActionExpandListenerを使用する方法を示し

how to handle back button of Search View in android

ちょうどコメントで追加@MateiRaduリンクを追加します。

これが役に立ちます。

+0

残念ながら、SearchViewが終了するとonClose()は呼び出されません。しかし、onQueryTextSubmit()とonQueryTextChange()(th3pat3lによって示唆されているように)が呼び出されます。理想的には、3人のリスナーをすべて利用したいと思っています。 – bdristan

+0

@bdristan私は自分の答えを更新しました。 – Darwind

+0

独自のSearchViewカスタムクラスを使用している場合は、次のようにします。@Override public void onActionViewCollapsed(){ super.onActionViewCollapsed(); } – Mike6679

4

ダーウィンズの答えは仕事をしますが、ユーザーがキーボードを閉じるために戻るボタンを押したときと、SearchViewにもうフォーカスがないときにのみ機能します。

より良い方法は、SearchViewのテキストの変更を聞くことです。
この方法で、テキストが更新されているときにビューを復元し、UIを制御できます。
ここで私はそれをやっています。

SearchView searchView = new SearchView(context); 
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
    @Override 
    public boolean onQueryTextSubmit(String query) { 
     // this is when user is done typing and clicks search 
     return false; 
    } 

    @Override 
    public boolean onQueryTextChange(String newText) { 
     // you can use this to do a "live" search while the user is typing. 
     // this will trigger each time user changes (adds or removes) text 
     // so when newText is empty, restore your views 
     return false; 
    } 
}); 
0

一つの他のトリックがあります:

searchView.setOnSearchViewListener(new MaterialSearchView.SearchViewListener() { 
       @Override 
       public void onSearchViewShown() { 
        if(!txtToolbarTitle.getText().toString().isEmpty()){ 
         searchView.setQuery(txtToolbarTitle.getText().toString()+ " ", false); 
        } 
       } 

       @Override 
       public void onSearchViewClosed() { 
        if(txtToolbarTitle.getText().toString().isEmpty()){ 
         finish(); 
        } 
       } 
      }); 
関連する問題