如何隐藏ActionBar中的ChromeCast MediaRoute MenuItem?

时间:2014-04-16 23:30:03

标签: android android-actionbar chromecast

我正在尝试在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按钮)如何再次显示按钮也是很好的。

感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我认为你所看到的(或者现在看到的)是由行动提供者/行动类的顺序决定的。展开的可折叠操作视图将占用操作栏末尾的空格,但不会占用前面的东西。因此,首先放置SearchView将让它接管整个栏。

答案 1 :(得分:0)

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

  • 使用MediaRouteButton代替ActionProvider;这也得到CCL的支持,并且它的可见性完全取决于你(CCL提供了一些回调,可以告诉你什么时候有一个设备匹配你的过滤器,你可以清楚地做到你认为适合这些数据)。这是我推荐的方法

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

同样,我认为第一种选择更清洁。如果它适合您,请告诉我们。