web-dev-qa-db-ja.com

SearchViewの戻るボタンの押下を検出する方法は?

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

または、ユーザーが検索結果から前のビュー(私の場合は同じビュー)に移動したことを検出する別の方法があるかもしれません。

ありがとう

14
bdristan

そのため、質問のタイトルを見ると、SearchViewが閉じられていることを検出する方法がわからないため、SearchViewはもう開いていません。

Android 4.0 +時点での古いソリューション

(単純な)解決策は以下を追加することです:SearchView.OnCloseListenerSearchViewに、次のように:

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がコメントに追加したリンクを追加するだけです:

Androidの検索ビューの戻るボタンの処理方法

これは、OnActionExpandListenerの代わりにOnCloseListenerを使用する方法も示しています。

お役に立てれば。

36
Darwind

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);
}
2
Rohit Bansal

もう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();
                    }
                }
            });
0
Sagar Chavada