片段中的菜单未显示

El *_*ino 46 android android-menu android-fragments

我对上一期的问题提供了非常有用的提示,我希望这次不会有所不同:)首先,让我解释一下情况.我有一个有2个片段的活动.对于每个片段,我有一个xml菜单布局,第一个有四个菜单项,第二个只有一个.现在首先加载具有四个菜单条目的片段.在我设置的onCreate方法中

this.setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

onCreateOptionsMenu方法

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragshow, menu);
}
Run Code Online (Sandbox Code Playgroud)

xml文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_refresh"
      android:icon="@drawable/ic_action_search"
      android:title="Refresh"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />
<item android:id="@+id/menu_clearall"
      android:icon="@drawable/ic_action_search"
      android:title="Clear"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />
<item android:id="@+id/menu_addcontent"
      android:icon="@drawable/ic_action_search"
      android:title="Add Content"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />
<item android:id="@+id/menu_newlist"
      android:icon="@drawable/ic_action_search"
      android:title="New List"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />    
</menu>
Run Code Online (Sandbox Code Playgroud)

这很好用.所有菜单项都在那里,我可以点击它们并回复.现在,当我单击"添加内容"菜单时,将加载另一个片段.我也在那里设定

this.setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

onCreateOptionsMenu方法

@Override 
public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
    Log.i("FragCreateList","onCreateOptionsMenu called");
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menu_fragcreatelist, menu);
}
Run Code Online (Sandbox Code Playgroud)

xml文件

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu_editdone"
      android:icon="@drawable/ic_action_search"
      android:title="Edit Done"
      android:visible="true"
      android:showAsAction="ifRoom|withText" />         
</menu>
Run Code Online (Sandbox Code Playgroud)

但是在新片段中我看不到任何菜单项.无论是在操作栏中,还是在我按下硬件菜单按钮时.在前一个片段中,两个菜单项位于操作栏中,其余两个菜单项在按下硬件按钮时出现.但这里没有显示任何内容.我得到了onCreateOptionsMenu方法被调用的logcat消息,但没有任何反应.(我甚至打电话给我的(空)onPrepareOptionsMenu方法,应该在菜单显示之前调用,仍然没有)任何线索可能是什么错误?调用invalidateOptionsMenu不会做任何事情.此外,我不确定要调用哪一个,因为有一个getActivity().invalidateOptionsMenu和一个getFragmentManager().invalidateOptionsMenu ...在此先感谢.

编辑:

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="15" />
Run Code Online (Sandbox Code Playgroud)

小智 89

我在onCreateView中添加了setHasOptionsMenu(true),它工作正常

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    setHasOptionsMenu(true);
    return inflater.inflate(R.layout.my_example_fragment, container, false);

}
Run Code Online (Sandbox Code Playgroud)


Abh*_*rma 53

在充气菜单之前使用menu.clear().

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    super.onCreateOptionsMenu(menu, inflater);
    menu.clear();
    inflater.inflate(R.menu.mnulayout, menu);
}
Run Code Online (Sandbox Code Playgroud)


小智 9

首先你的片段必须在 onCreate

    setHasOptionsMenu(true);
Run Code Online (Sandbox Code Playgroud)

然后你必须检查你的活动是否有像NoActionBar这样的主题它有点棘手但是如果你的活动有那个主题并不重要你在哪里调用setHasOptionsMenu(true)你的片段不会画她的


agl*_*our 7

我有同样的问题.我通过在应用于myApp上下文的项目中使用showAsAction来修复它:

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:myapp="http://schemas.android.com/apk/res-auto">
    <item android:id="@+id/action_refresh"
          android:icon="@drawable/ic_refresh"
          android:title="refresh"
          android:visible="true"
          myapp:showAsAction="ifRoom|withText"/>
</menu>
Run Code Online (Sandbox Code Playgroud)

对不起,对你来说太晚了,但对其他人来说可能有用.

  • 注意:使用支持片段时,使用`android:showAsAction`似乎没有效果,因此使用res-auto设置第二个命名空间至关重要.谢谢您的帮助. (3认同)

小智 5

这是因为您的设备有硬件菜单按钮.因此,变量"sHasPermanentMenuKey"的值在ViewConfiguration hasPermanentMenuKey()中为true .您必须使用反射将此变量的值设置为false.例:

// this method force showing menu button in device with hardware menu button
private void showOverflowMenu(FragmentActivity activity) {
    try {
        ViewConfiguration config = ViewConfiguration.get(activity);
        Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
        if (menuKeyField != null) {
            menuKeyField.setAccessible(true);
            menuKeyField.setBoolean(config, false);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:在活动的onCreate()中使用此方法,而不是在片段的onCreate()方法中.


Coc*_*ens 5

这实际上对我有用,也可能是你的解决方案.

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
}
Run Code Online (Sandbox Code Playgroud)


Dim*_*oid 0

尝试将 onCreateOptionsMenu 更改为 onPrepareOptionsMenu 片段,我遇到了同样的问题,据我记得这为我解决了它......