SearchViewの表示と検索結果の表示に単一のアクティビティを使用しています。検索結果はアイテムのサブセットにすぎないため、検索はフィルターとして機能します。 SearchViewの戻るボタンをクリックしたときにビュー内のすべてのアイテムを復元する方法がわからないことを除いて、すべてが正常に機能しているようです。
または、ユーザーが検索結果から前のビュー(私の場合は同じビュー)に移動したことを検出する別の方法があるかもしれません。
ありがとう
そのため、質問のタイトルを見ると、SearchView
が閉じられていることを検出する方法がわからないため、SearchView
はもう開いていません。
Android 4.0 +時点での古いソリューション
(単純な)解決策は以下を追加することです:SearchView.OnCloseListener
をSearchView
に、次のように:
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
は次のようになります。
@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;
}
});
}
Googleがわからないドキュメントにコメントを書くことさえしなかった理由については、残念です。
EDIT2:
@MateiRaduがコメントに追加したリンクを追加するだけです:
これは、OnActionExpandListener
の代わりにOnCloseListener
を使用する方法も示しています。
お役に立てれば。
Darwindの答えは仕事をしますが、それはユーザーがキーボードを閉じるために戻るボタンを押したときと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;
}
});
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem searchItem = menu.findItem(R.id.action_search);
searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
searchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener()
{
@Override
public void onFocusChange(View v, boolean newViewFocus)
{
if (!newViewFocus)
{
//Collapse the action item.
searchItem.collapseActionView();
//Clear the filter/search query.
myFilterFunction("");
}
}
});
return super.onCreateOptionsMenu(menu);
}
もう1つのトリックがあります。
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();
}
}
});