簡體   English   中英

如何檢測 SearchView 的后退按鈕按下?

[英]How to detect SearchView's back button press?

我正在使用單個活動來顯示 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.
    }
});

編輯

適用於 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;
        }
    });
}

至於為什么谷歌甚至懶得在我不知道的文檔中寫評論,但很遺憾。

編輯2

只需添加@MateiRadu 在評論中添加的鏈接:

如何在android中處理搜索視圖的后退按鈕

這也展示了如何使用OnActionExpandListener而不是OnCloseListener

希望這會有所幫助。

這里的所有代碼都已棄用 你應該使用這樣的東西。

final MenuItem item = menu.findItem(R.id.action_search);
final SearchView searchView = (SearchView) item.getActionView();

item.setOnActionExpandListener(new MenuItem.OnActionExpandListener() {

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                Toast.makeText(getActivity(), "onMenuItemActionExpand called", Toast.LENGTH_SHORT).show();
                return true;
            }

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

希望這會有所幫助。

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

還有一個技巧:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM