如何覆盖搜索视图中的向上按钮行为

Posted

技术标签:

【中文标题】如何覆盖搜索视图中的向上按钮行为【英文标题】:How do I override up button behavior in search view 【发布时间】:2015-12-10 18:24:27 【问题描述】:

我已经像 YouTube 应用一样在单独的片段中实现了 searchView。因此,当用户单击搜索图标时,新片段会启动并展开搜索视图。

现在,如果现在单击向上按钮,则搜索视图将折叠。只有当再次单击向上按钮时,才会从后堆栈中显示上一个片段。

我需要做的是,当用户从展开的搜索视图状态单击向上按钮时,搜索片段会立即关闭并出现前一个片段。

任何帮助表示赞赏。

更新

我找到了几乎可行的解决方案:

    MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() 
        @Override
        public boolean onMenuItemActionCollapse(MenuItem item) 
            Log.d(LOG_TAG, "onMenuItemActionCollapse");
            onBackPressed();
            return true;  // Return true to collapse action view
        

        @Override
        public boolean onMenuItemActionExpand(MenuItem item) 
            // Do something when expanded
            return true;  // Return true to expand action view
        
    );

但是这个解决方案有一个大问题:如果在搜索视图文本字段中有文本时按下返回箭头按钮,那么

java.lang.IllegalStateException: Fragment SearchFragment not attach to Activity 被抛出。

为什么会发生这种异常以及如何避免它?

【问题讨论】:

【参考方案1】:

在您的活动/片段中覆盖 onOptionsItemSelected()。向上按钮的 ID 为“android.R.id.home”

        @Override
        public boolean onOptionsItemSelected(MenuItem item) 
            switch (item.getItemId()) 
            case android.R.id.home:
                //Handle Up button
                return true;
            default:
                return super.onOptionsItemSelected(item);
            
        

【讨论】:

【参考方案2】:
mSearchView.setOnCloseListener(new SearchView.OnCloseListener() 
    @Override    
    public boolean onClose() 
        getFragmentManager().popBackStack(); // Or other mechanism, depends on what you have.
        return false; // Don't consume event, will dismiss search.
    
);

【讨论】:

以上是关于如何覆盖搜索视图中的向上按钮行为的主要内容,如果未能解决你的问题,请参考以下文章

如何控制 Android 视图中的轨迹球行为?

Android Studio:如何防止工具栏中的向上按钮将子视图向右推?

在 iPad 上,如何防止模态视图在键盘呈现时向上移动?

子类化 UIScrollView 时的奇怪行为

覆盖 UIActivityViewController 默认行为

如何实现覆盖表视图进行搜索?