2

我有一个类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>

我有另一个片段FragmentAFragmentB延伸到那个BaseFragment。在FragmentA中,我想显示所有菜单,并且在运行应用程序时一切正常,但在FragmentB中,我想显示下载和最喜欢的 whitout 搜索和刷新。

我试图在基础上创建一个方法来操纵 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 中

4

3 回答 3

0

您无法在其回调之外访问菜单。因为您可以实现ActionProvider子类来处理所需菜单项的可见性。

或者您可以调用活动的 invalidateOptionsMenu() 方法来请求重新创建选项菜单,并更改 onCreateOptionsMenu() 中项目的可见性

于 2014-01-15T09:11:32.617 回答
0

最简单的方法是onCreateOptionsMenu再次覆盖 FragmentB。

@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;
}
于 2014-01-15T10:05:06.210 回答
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"/>

添加setHasOptionsMenu(true)onCreate() 方法以调用 Fragment 类中的菜单项。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

您无需再次覆盖onCreateOptionsMenuFragment 类。菜单项可以通过onPrepareOptionsMenu片段中可用的覆盖方法来更改(添加/删除)。

@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.findItem(R.id.action_newItem).setVisible(true);
    super.onPrepareOptionsMenu(menu);

}
于 2015-03-04T05:29:53.870 回答