【问题标题】:Menu inside fragment not getting called片段内的菜单没有被调用
【发布时间】:2013-03-27 08:48:27
【问题描述】:
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d("Does", "get called");
    inflater.inflate(R.menu.menuitem, menu);
    super.onCreateOptionsMenu(menu, inflater);
}

下面是我调用的 onCreateView 方法

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

我的操作栏中没有调用日志语句或菜单。

更新:我尝试从片段的 onCreate 方法调用这个,但菜单没有显示。

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

菜单.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@+id/section" android:title="@string/section"
        android:icon="@drawable/ic_section"
        android:showAsAction="always" />

    <item android:id="@+id/refresh" android:title="@string/refresh" 
        android:icon="@drawable/ic_refresh"
        android:showAsAction="always" />

    <item android:id="@+id/edit_patient" android:title="@string/edit_patient" 
        android:icon="@drawable/ic_editpatient"
        android:showAsAction="always" />    

    <item android:id="@+id/about" android:title="@string/about"
        android:showAsAction="never" />

    <item android:id="@+id/help" android:title="@string/help"
        android:showAsAction="never" />

    <item android:id="@+id/signout" android:title="@string/signout"
        android:showAsAction="never" />

</menu>

【问题讨论】:

  • 你使用的是哪个版本的android我的意思是api级别..
  • @Abhijit
  • 请同时添加您的 R.menu.menuitem xml 文件。

标签: java android


【解决方案1】:

您需要在 Fragment 的起始生命周期方法之一中调用 setHasOptionsMenu(true);。最好来自onCreate(...)

在极简情况下,您的 Fragment 的 onCreate 方法如下所示:

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

此外,在您扩充自定义菜单后调用 super.onCreateOptionsMenu(menu, inflater); 会将您刚刚扩充的菜单重置为空菜单。

所以要么调用:

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d("Does", "get called");
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.menuitem, menu);
}

或:

@Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    Log.d("Does", "get called");
    //no super call
    inflater.inflate(R.menu.menuitem, menu);
}

此外,如果您在 Gingerbread 设备上进行测试,如果主机 Activity 不包含它自己的菜单项,则菜单可能不会显示。

【讨论】:

  • 当我尝试从我的活动 onCreate() 方法调用 setHasOptionsMenu(true) 时,我收到此错误。 " 方法 setHasOptionsMenu(boolean) 未定义 BaseActivity 类型"
  • 如上所述,您需要在 Fragment 中调用此方法。
  • 我正在 Google Nexus 平板电脑上测试它,所以在这种情况下我应该怎么做。
  • @keyboardsurfer ,如果您在 Gingerbread 设备上进行测试,如果托管 Activity 不包含它自己的菜单项,则菜单可能不会显示。你能解释一下吗,因为我有同样的问题。(我想)stackoverflow.com/questions/20420023/…
  • 只需在此处添加我的 2cents。这篇文章帮助我解决了我的问题,但还不够。据说我一直在使用 Toolbar 关注最新的 Google 文档(Material Design 和 AppCompat v21),我最初以“独立”方式添加了我的 Toolbar(您可以在此处查看 android-developers.blogspot.it/2014/10/…)。这意味着我的工具栏未附加并用作操作栏。因此,帖子内容在这里对我没有帮助。当我改变了处理工具栏的方式(现在使用 setSupportActionBar() )时,一切都很顺利。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多