我试图从一组片段添加一个项目到选项菜单 .
我创建了一个新的 MenuFragment
类,并为希望包含菜单项的片段扩展了这个 . 这是代码:
public class MenuFragment extends Fragment {
MenuItem fav;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
fav = menu.add("add");
fav.setIcon(R.drawable.btn_star_big_off);
}
}
出于某种原因, onCreateOptionsMenu
似乎没有运行 .
19 回答
我的问题略有不同 . 我做的一切都很对 . 但是我继承了托管片段的活动的错误类 .
因此,要清楚,如果要覆盖片段中的
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
,请确保承载此片段的活动类继承android.support.v7.app.ActionBarActivity
(如果您希望支持以下API级别11) .我继承了
android.support.v4.app.FragmentActivity
以支持低于11的API级别 .调用超级方法:
将日志语句放在代码中以查看是否未调用该方法,或者您的代码是否未修改该菜单 .
还要确保在
onCreate
中调用SetHasOptionsMenu
来通知片段它应该参与选项菜单处理 .我遇到了同样的问题,但我认为最好总结一下并介绍最后一步让它运转起来:
在Fragment的
onCreate(Bundle savedInstanceState)
方法中添加setHasOptionsMenu(true)方法 .覆盖
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
(如果你想在Fragment的菜单中做一些不同的事情)和片段中的onOptionsItemSelected(MenuItem item)
方法 .在
onOptionsItemSelected(MenuItem item)
Activity的方法中,确保在onOptionsItemSelected(MenuItem item)
Fragment的方法中实现菜单项操作时返回false .一个例子:
Activity
Fragment
如果您发现未调用
onCreateOptionsMenu(Menu menu, MenuInflater inflater)
方法,请确保从Fragment的onCreate(Bundle savedInstanceState)
方法中调用以下内容:就我而言,我需要一个菜单来刷新特定片段中的
webview
,因为我使用了:Fragment :
文件menu.xml
在
menu.xml
中,您应该添加所有菜单项 . 然后,您可以隐藏在初始加载中不想看到的项目 .menu.xml
在onCreate()方法中添加
setHasOptionsMenu(true)
以调用Fragment类中的菜单项 .FragmentClass.java
您不需要再次在Fragment类中重写
onCreateOptionsMenu
. 可以通过覆盖Fragment中可用的onPrepareOptionsMenu
方法来更改(添加/删除)菜单项 .在充气菜单之前,您需要使用menu.clear() .
和
就我而言,这是步骤 .
步骤-1
步骤-2
步骤3
我遇到了同样的问题,我的片段是ViewPager的页面 . 它发生的原因是我在实例化FragmentPagerAdapter时使用子片段管理器而不是活动支持片段管理器 .
如果要添加菜单自定义
菜单文件:
活动代码:
片段代码:
TL; DR
使用
android.support.v7.widget.Toolbar
并执行:独立工具栏
大多数建议的解决方案,例如
setHasOptionsMenu(true)
仅在 parent Activity has the Toolbar in its layout 时起作用,并通过setSupportActionBar()
声明它 . 然后片段可以参与这个确切的ActionBar的菜单群:If you want a standalone toolbar and menu for one specific Fragment 您可以执行以下操作:
menu_custom_fragment.xml
custom_fragment.xml
CustomFragment.kt
是的,它甚至需要覆盖
onCreate()
或onCreateOptionsMenu()
.PS:这只适用于
android.support.v4.app.Fragment
和android.support.v7.widget.Toolbar
(同样一定要在styles.xml
中使用AppCompatActivity
和AppCompat
主题) .你的代码很好 . 方法中只缺少super:
我变得疯狂,因为这里没有任何答案对我有用 .
To show the menu I had to call:
setSupportActionBar(toolbar)
完成!
注意:如果您的
toolbar
视图不是't in the same activity layout you can' t直接从您的活动类使用上面的调用,在这种情况下,您需要从您的片段类中获取该活动,然后调用setSupportActionBar(toolbar)
. 记住:您的活动类应该扩展AppCompatActivity .希望这个答案对你有所帮助 .
在创建片段视图后设置选项菜单对我来说效果很好 .
我要补充一点,以及它不适合我的原因 .
它类似于Napster的答案 .
来自Google参考Documentation for FragmentActivity:
要更新Napster的答案 - 现在不推荐使用
ActionBarActivity
,请改用AppCompatActivity
.使用
AppCompatActivity
时,还要确保将“活动主题设置为Theme.AppCompat
或类似主题”(Google Doc) .注意:
android.support.v7.app.AppCompatActivity
是android.support.v4.app.FragmentActivity
类的子类(请参阅AppCompatActivity ref doc) .在菜单文件夹中创建一个.menu xml文件并添加此xml
在你的片段类中覆盖此方法和
现在只需在fragment类中设置菜单xml文件
如果上述所有方法都不起作用,则需要调试并确保已调用函数onCreateOptionsMenu(通过放置调试或写入日志...)
如果它没有运行,也许你的Android主题不支持操作栏 . Open AndroidManifest.xml and set the value for android:theme with theme support action bar :
在你的 onCreate 方法上添加 setHasOptionMenu()
那么 override 你的 onCreateOptionsMenu