我正在尝试在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菜单项仍然可见。
感谢任何帮助。
答案 0 :(得分:1)
我认为你所看到的(或者现在看到的)是由行动提供者/行动类的顺序决定的。展开的可折叠操作视图将占用操作栏末尾的空格,但不会占用前面的东西。因此,首先放置SearchView
将让它接管整个栏。
答案 1 :(得分:0)
我在这里说的只是一些我没有测试过的想法,所以当你读到这篇文章时要考虑到这一点。由于MediaRouterActionProvider由框架管理,我认为你不能手动隐藏它;我想系统会在定期扫描时覆盖它。我在这里看到两个选项:
使用MediaRouteButton代替ActionProvider;这也得到CCL的支持,并且它的可见性完全取决于你(CCL提供了一些回调,可以告诉你什么时候有一个设备匹配你的过滤器,你可以清楚地做到你认为适合这些数据)。这是我推荐的方法
使用hack:有两个MediaRouteSelector;与appId相关联的一个不存在(或未发布且没有设备与之关联),以及与您的良好appId相关联的第二个。如果您使用第一个选择器,该按钮将消失,因为没有符合该appId的设备,而第二个选择器的行为正常。
同样,我认为第一种选择更清洁。如果它适合您,请告诉我们。