Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/204.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何检测SearchView';什么是后退按钮?_Android_Android Layout_Searchview_Android Search - Fatal编程技术网

Android 如何检测SearchView';什么是后退按钮?

Android 如何检测SearchView';什么是后退按钮?,android,android-layout,searchview,android-search,Android,Android Layout,Searchview,Android Search,我使用单个活动来显示SearchView以及显示搜索结果。搜索结果只是项目的子集,因此搜索充当过滤器。一切似乎都很好,只是当单击SearchView的后退按钮时,我不知道如何恢复视图中的所有项目 或者,也许有另一种方法可以检测用户何时从搜索结果导航到上一个视图(在我的例子中,这是同一个视图) 感谢因此,查看问题的标题,您不确定如何检测搜索视图何时关闭,因此当搜索视图不再打开时,您无法将视图恢复到“正常”状态 Android 4.0+之后的过时解决方案 (简单的)解决方案是将: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.
    }
});
@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;
        }
    });
}
编辑

适用于Android 4.0+的更新解决方案

显然,
OnCloseListener
有缺陷,无法在较新版本的Android(4.0+)上运行。见:

解决方案是使用
SearchView
的支持库版本:

我的
onCreateOptions菜单
如下所示:

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

只需添加@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;
    }
});

还有一个窍门:

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

这里的所有代码都已弃用!你应该用这样的东西

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

希望这会有所帮助。

在这里查看Matei Radu,感谢您提供了我所需的所有信息的链接-包括对th3pat3I答案的扩展。@b里斯坦在我更新了我的答案后,我现在看到@MateiRadu为您提供了正确的答案,用于收听打开/关闭
搜索视图
。不过,我希望我的答案仍然有帮助,因为它在某种程度上解释了为什么它不再有效:-)@Darwind如果bdristan想将其标记为已被接受,你应该在答案底部添加我共享的链接,使其成为未来观众的一个更完整的解决方案。@MateiRadu我刚刚做了-至少在完整性方面它有帮助-就是这样阅读答案让人恼火,你会觉得自己在理解中遗漏了一些东西;-)不幸的是,SearchView关闭时没有调用onClose()。但是,onQueryTextSubmit()和onQueryTextChange()——正如th3pat3l所建议的那样——确实会被调用。理想情况下,我希望利用所有三个侦听器。如果您有自己的SearchView自定义类,请使用:@Override public void onActionViewCollapsed(){super.onActionViewCollapsed();}MenuItemCompat现在不推荐使用。尝试MenuItem.setOnActionExpandListener();MenuItemCompat.setOnActionExpandListener()不推荐使用。解决方案:使用这个,它很有帮助