我有一个课 BaseFragment 我创建了一个私人菜单,并从
设置该菜单@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
this.menu = menu;
}
在main.xml中我有:
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- Search / will display always -->
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
android:showAsAction="ifRoom"/>
<!-- Refresh -->
<item android:id="@+id/action_refresh"
android:icon="@drawable/ic_action_refresh"
android:title="@string/action_refresh"
android:showAsAction="ifRoom" />
<!-- Download -->
<item android:id="@+id/action_download"
android:icon="@drawable/ic_action_download"
android:title="@string/action_download"
android:showAsAction="never"/>
<!-- Favorite -->
<item android:id="@+id/action_favorites"
android:icon="@drawable/ic_action_favorites"
android:title="@string/action_favorites"
android:showAsAction="never" />
</menu>
我有另一个片段 FragmentA , FragmentB 扩展到 BaseFragment 。 在 FragmentA 中,我想显示所有菜单,并且在运行应用时一切正常,但在 FragmentB 中,我想显示下载和收藏的whitout搜索和刷新。
我尝试在base上创建一个方法来操作menuitem上的可见性,我的菜单总是返回null。
protected void setSearchable(boolean isSearchable){
menu.findItem(R.id.action_search).setVisible(isSearchable);
}
protected void setHasRefreshFuction(boolean isHasRefreshFunction){
menu.findItem(R.id.action_refresh).setVisible(isHasRefreshFunction);
}
protected void setDownloadable(boolean isDownloadable){
menu.findItem(R.id.action_download).setVisible(isDownloadable);
}
protected void setFavorite(boolean isFavorite){
menu.findItem(R.id.action_favorites).setVisible(isFavorite);
}
我在FragmentB中的onCreate()上调用该方法,如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setDownloadable(true);
setFavorite(true);
setHasRefreshFuction(false);
setSearchable(false);
}
有人可以帮助我吗....我读了许多教程,但找不到答案。 注意:我是setHasOptionsMenu(true);在BaseFragment中的oncreate
答案 0 :(得分:0)
您无法在其回调中访问菜单。因为您可以实现ActionProvider子类来处理所需菜单项的可见性。
或者您可以调用活动的invalidateOptionsMenu()方法来请求重新创建选项菜单,并更改onCreateOptionsMenu()中项目的可见性
答案 1 :(得分:0)
最简单的方法是再次覆盖FragmentB中的onCreateOptionsMenu
。
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.main, menu);
menu.findItem(R.id.action_search).setVisible(false);
menu.findItem(R.id.action_refresh).setVisible(false);
this.menu = menu;
}
答案 2 :(得分:0)
在menu.xml
中,您应该添加所有菜单项。然后,您可以隐藏在初始加载中不想看到的项目。
<item
android:id="@+id/action_newItem"
android:icon="@drawable/action_newItem"
android:showAsAction="never"
android:visible="false"
android:title="@string/action_newItem"/>
在onCreate()方法中添加setHasOptionsMenu(true)
以调用Fragment类中的菜单项。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
您无需再次覆盖Fragment类中的onCreateOptionsMenu
。可以通过覆盖Fragment中可用的onPrepareOptionsMenu
方法来更改菜单项(Add / remoev)。
@Override
public void onPrepareOptionsMenu(Menu menu) {
menu.findItem(R.id.action_newItem).setVisible(true);
super.onPrepareOptionsMenu(menu);
}