简介
在Fragment中制作右上角的菜单栏与在activity中制作并无太大差别,本篇文章将介绍在Fragment中建立菜单栏以及说明与在activity中制作的差别
建立菜单栏布局文件
右键res文件夹,选择new-Directory,新建文件夹,命名为menu
在右击新建的menu文件夹,建立Menu resource file菜单项资源文件
给菜单项资源文件命名,其余默认
接着在新建的菜单项资源文件中添加如下代码
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/firstitem"
android:icon="@drawable/first_item_icon"
android:title="@string/first_item"
android:showAsAction="ifRoom"/>
<item
android:id="@+id/seconditem"
android:title="@string/second_item"
android:icon="@drawable/second_item_icon"
android:showAsAction="ifRoom"/>
</menu>
其中每个<item/>标签代表一个菜单项
android:title表示菜单项的文字内容,这里文字内容我们已经在文字资源values-string里编写好,直接引用,android:icon表示菜单项的图标,android:showAsAction表示菜单项的显示方式,建议可选值有:1、ifroom,如果空间足够,菜单项显示在标题栏上;2、withtext,如果空间足够则菜单栏图标与文字一起显示;3、never,无论空间是否充足,菜单项一直在溢出菜单栏中,即右上角的三个点里。前两项如果空间不足则菜单项也会放置在溢出菜单中
与Fragment建立联系
建立完菜单项文件后,就要与要显示的Fragment建立联系。
在Fragment活动类中重写以下两个方法
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.top_right_menu,menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.firstitem:
return true;
case R.id.seconditem;
return true;
default:
return super.onOptionsItemSelected(item);
}
}
其中onCreateOptionsMenu生成菜单项;onOptionsItemSelected回应处理点击菜单项产生的逻辑,该方法通过资源id找到点击的菜单项,我们可以将逻辑代码写在case和return之间,因为onOptionsItemSelected方法返回的是boolean值,所以我们应在逻辑代码处理完毕后返回true以表命任务完成。
注意点
做完以上事情后我们发现菜单项并没有显示,这是因为Fragment管理器还不知道它管理的Fragment要接受菜单项方法,所以我们要在Fragment中重写onCreate(),并加上setHasOptionsMenu(true);菜单项才能显示
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
不同
与在Activity中制作菜单栏不同的是,在activity中,重写生成菜单栏的方法为
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.top_right_menu,menu);
return super.onCreateOptionsMenu(menu);
}
只需要传入菜单项资源参数且是boolean类型的方法;并且不需要在onCreate方法中添加setHasOptionsMenu(true)方法。处理菜单项点击的方法则相同。
欢迎下方评论交流讨论!