如何在 ActionBar 中隐藏 ChromeCast MediaRoute MenuItem?

Posted

技术标签:

【中文标题】如何在 ActionBar 中隐藏 ChromeCast MediaRoute MenuItem?【英文标题】:how to hide the ChromeCast MediaRoute MenuItem in the ActionBar? 【发布时间】:2014-04-16 23:30:03 【问题描述】:

我正在尝试在 ChromeCast 应用程序的上下文中使用 ActionBar 设置搜索界面(使用来自 CastCompanionLibrary 和 VideoBrowserActivity git 项目的代码)。我需要一种方法来隐藏 ChromeCast MediaRoute MenuItem(简称 ChromeCast 按钮)。它并列在一个搜索图标旁边,当用户点击搜索图标时,ChromeCast 按钮应该消失,以便让搜索视图展开(尽可能多的 ActionBar)。

首先,定义我的 ActionBar 的 XML 如下所示。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto" >
 ...
 <item android:id="@+id/media_route_menu_item"
  android:title="@string/media_route_menu_title"
  app:actionProviderClass="android.support.v7.app.MediaRouteActionProvider"
  app:showAsAction="always"/>
 <item android:id="@+id/action_search"
  android:title="@string/action_search"
  android:icon="@drawable/ic_action_search"
  android:actionViewClass="android.widget.SearchView"
  app:showAsAction="always"/>
</menu>

然后,在我的活动(ActionBarActivity 的子类)中,我按如下方式创建菜单。

public boolean onCreateOptionsMenu(Menu menu) 
 super.onCreateOptionsMenu(menu);
 getMenuInflator().inflate(R.menu.main, menu);
 MenuItem miSearch = menu.findItem(R.id.action_search); 
 SearchView view = (SearchView)miSearch.getActionView();
 SearchManager searchManager = (SearchManager)getSystemService(Context.SEARCH_SERVICE);
 view.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
 mediaRouteMenuItem = mCastManager.addMediaRouterButton(menu, R.id.media_route_menu_item);
 return true;

我尝试如下隐藏 MediaRoute 菜单项(此方法取自另一个 SO 帖子)。

public boolean onOptionsItemSelected(MenuItem item) 
 switch(item.getItemId()) 
  case R.id.action_search:
   mediaRouteMenuItem.setVisible(false);
   invalidateOptionsMenu();
   return true;
 

然而,当用户点击搜索图标时,MediaRoute 菜单项仍然可见。

如果用户取消搜索操作,如果可以隐藏 ChromeCast 按钮,也很高兴知道如何使该按钮再次可见。

感谢任何帮助。

【问题讨论】:

如果您颠倒两个&lt;item&gt; 元素的顺序,将MediaRouteActionProvider 放在第二个,会发生什么? @CommonsWare 那么这更像是我所针对的行为。 MediaRoute 菜单项实际上消失了。谢谢。 @CommonsWare 也许您应该复制并粘贴该单行字作为答案,我可以将其设置为答案。 【参考方案1】:

我认为您所看到的(或现在看到的)是由动作提供者/动作类的顺序决定的。展开的可折叠操作视图将占据操作栏末尾的空间,但不会破坏它之前的内容。因此,将SearchView 放在首位将让它占据整个栏。

【讨论】:

【参考方案2】:

我在这里所说的只是一些我没有测试过的想法,所以在阅读本文时要考虑到这一点。由于 MediaRouterActionProvider 是由框架管理的,我不认为你可以手动隐藏它;我想系统会在定期扫描时覆盖它。我在这里看到两个选项:

使用 MediaRouteButton 代替 ActionProvider;这也受 CCL 支持,其可见性完全取决于您(CCL 提供了一些回调,可以告诉您何时有设备匹配您的过滤器,并且您可以清楚地按照您认为适合该数据的方式进行操作)。这是我推荐的方法

使用 hack:有两个 MediaRouteSelector;一个与不存在的 appId 相关联(或未发布且没有设备与之关联),另一个与您的好 appId 相关联。如果您使用第一个选择器,则该按钮将消失,因为没有符合该 appId 的设备,而第二个选择器将正常运行。

同样,我认为第一个选项更简洁。让我们知道它是否适合您。

【讨论】:

这些选项看起来有点矫枉过正,但您无法手动隐藏它是对的。我在 netflix 或 google Play Music 应用程序等 UI 设计中看到的是,它们只是在 ActionBar 上添加了搜索(图标)菜单项,当用户点击它时,就会打开一个新的 Activity。也许这是一个更好的流程和 UI 设计。谢谢

以上是关于如何在 ActionBar 中隐藏 ChromeCast MediaRoute MenuItem?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ActionBar 中隐藏 ChromeCast MediaRoute MenuItem?

如何隐藏默认片段 actionBar 在 android & kotlin 中创建我们自己的 actionBar

Android:如何在某些活动上隐藏 ActionBar

android如何去掉actionbar

如何使用 AppCompat v.7 显示和隐藏 ActionBar

从片段中隐藏 NavigationDrawer 和 ActionBar