menu与Fragment《android初开发探索(三)》在Fragment中制作右上角菜单栏

简介

在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)方法。处理菜单项点击的方法则相同。

欢迎下方评论交流讨论!

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.创建一个NavigationDrawer Fragment NavigationDrawer Fragment即为侧滑菜单的实现,可以通过以下步骤创建: 1.1 新建一个Blank FragmentAndroid Studio,右键点击app文件夹,选择New -> Fragment -> Fragment(Blank),并命名为NavigationDrawerFragment。 1.2 修改布局文件 在NavigationDrawerFragment的布局文件,添加一个DrawerLayout作为根布局,然后在DrawerLayout添加一个NavigationView,如下所示: <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <FrameLayout android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"/> <android.support.design.widget.NavigationView android:id="@+id/navigation_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/navigation_header" app:menu="@menu/navigation_menu"/> </android.support.v4.widget.DrawerLayout> 其,NavigationView的headerLayout属性可以指定一个布局文件作为NavigationView的头部,例如: <android.support.design.widget.NavigationView ... app:headerLayout="@layout/navigation_header" ... /> 1.3 创建菜单文件 在res文件夹创建一个menu文件夹,并在其创建一个navigation_menu.xml文件,用于定义菜单项。例如: <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_item_1" android:checked="true" android:icon="@drawable/ic_menu_item_1" android:title="@string/menu_item_1"/> <item android:id="@+id/nav_item_2" android:icon="@drawable/ic_menu_item_2" android:title="@string/menu_item_2"/> <item android:id="@+id/nav_item_3" android:icon="@drawable/ic_menu_item_3" android:title="@string/menu_item_3"/> </group> </menu> 1.4 实现DrawerLayout的开关 在NavigationDrawerFragment的onCreateView方法,可以通过以下代码实现DrawerLayout的开关: DrawerLayout drawerLayout = (DrawerLayout) view.findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( getActivity(), drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawerLayout.addDrawerListener(toggle); toggle.syncState(); 其,ActionBarDrawerToggle是一个内置的开关控件,可以在DrawerLayout的开关状态下自动切换ActionBar的图标和标题,同时也支持手势滑动开关。 2.创建一个Content Fragment Content Fragment即为导航栏的内容部分,可以通过以下步骤创建: 2.1 新建一个Blank FragmentAndroid Studio,右键点击app文件夹,选择New -> Fragment -> Fragment(Blank),并命名为ContentFragment。 2.2 修改布局文件 在ContentFragment的布局文件,添加一个LinearLayout作为根布局,然后在LinearLayout添加需要显示的内容,例如: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/content"/> </LinearLayout> 其,TextView可以替换为其他需要显示的控件,例如ListView、RecyclerView等。 3.实现导航栏的切换 通过以上步骤,已经创建了一个带有侧滑菜单和内容部分的Activity,下面可以通过NavigationView的点击事件实现导航栏的切换。 在NavigationDrawerFragment,可以通过以下代码实现NavigationView的点击事件: NavigationView navigationView = (NavigationView) view.findViewById(R.id.navigation_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { Fragment fragment = null; switch (item.getItemId()) { case R.id.nav_item_1: fragment = ContentFragment.newInstance(1); break; case R.id.nav_item_2: fragment = ContentFragment.newInstance(2); break; case R.id.nav_item_3: fragment = ContentFragment.newInstance(3); break; } if (fragment != null) { FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .replace(R.id.container, fragment) .commit(); DrawerLayout drawerLayout = (DrawerLayout) getActivity().findViewById(R.id.drawer_layout); drawerLayout.closeDrawer(GravityCompat.START); } return true; } }); 其,onNavigationItemSelected方法根据点击的菜单项创建对应的ContentFragment,并将其替换到布局文件的container。最后,需要关闭DrawerLayout的侧滑菜单。 至此,一个基本的导航栏就实现了,可以通过添加菜单项和内容部分来扩展导航栏的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值