【Android开发日记】使用 NavigationDrawer + fragment 实现sherlockActionBar+slidingmenu 功能

本文详细介绍了如何在Android APP中利用Navigation Drawer与Fragment结合实现更灵活的界面切换功能。通过自定义Fragment并修改MainActivity中的onNavigationDrawerItemSelected函数,实现了根据菜单项选择动态加载不同内容的Fragment。同时,演示了如何在每个Fragment中调用onAttach方法告知Actionbar当前展示的Fragment,从而实现实时更新Actionbar显示效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    slidingmenu + sherlockActionBar 是Android APP比较新的一种布局方式 .Github上有两个项目的library和demo,也有一些博客介绍如何实现。我的理解是这样的,slidingmenu是基于sherlockActionbar的library实现的,而自己的工程又是基于slidingmenu的library实现的,找了一些demo,library的配置也挺烦人的。

    今天在创建新工程时看到了有一种 theme 叫 NavigationDrawer 就好奇捡了个空项目,跑了一看原来就是sherlockActionBar+slidingmenu 嘛。

    demo中给出的切换的Fragment是一个类的不同实例,只是改变了其中的一个textview,但是我们实际应用中需要点击不同的menu切换不一样的Fragment。

    demo中有两个java文件:NavigationDrawerFragment.java 和 MainActivity.java 其中在NavigationDrawerFragment.java中定义了一个接口,在 MainActivity.java中使用了该接口,从而实现点击menu时切换fragment的功能。内容这里不介绍叙述,因为我也不是很清楚,担心解释错误,不过英文注释很到位。

    下面说下我的改动:

     1.自己写好 要切换的 Fragment: AFragment.java  BFragment.java CFragment.java...

     2.更改MainActivity.java 中的 onNavigationDrawerItemSelected函数 接口函数。

        demo中是这样的:

public void onNavigationDrawerItemSelected(int position) {
		// update the main content by replacing fragments
		FragmentManager fragmentManager = getSupportFragmentManager();
		fragmentManager
				.beginTransaction()
				.replace(R.id.container,
						PlaceholderFragment.newInstance(position + 1)).commit();
}
      其中PlaceholderFragment 是demo中 MainActivity.java的一个Fragment类,切换fragment时 根据传进的参数 position 来显示一个new的Fragment。

      我将这个接口函数改成这样:

     

public void onNavigationDrawerItemSelected(int position) {
		// update the main content by replacing fragments
		FragmentManager fragmentManager = getSupportFragmentManager();
		
		switch (position)
		{
			
			case 0:
				fragmentManager
				.beginTransaction()
				.replace(R.id.container,
						new AFragment()).commit();
				break;
			case 1:
				fragmentManager
				.beginTransaction()
				.replace(R.id.container,
						new BFragment()).commit();
				break;
			case 2:
<pre name="code" class="java">                                fragmentManager
				.beginTransaction()
				.replace(R.id.container,
			        new CFragment()).commit();
				break;
			default:
				Toast.makeText(this, "position:"+Integer.toString(position), Toast.LENGTH_SHORT).show();
		
		}
	}

           用一个switch和 原来的position参数实现 切换自定义的Fragment。

           需要注意的是,这个switch仅仅能切换Fragment,而切换Fragment时要将选定的childmenu的名称显示在Actionbar上面还需要把在自定义的每个Fragment中都调用一次

MainActivity.java中的  onSectionAttached  函数,来告知MainActivity的Actionbar 你当前呈现的是哪个Fragment。即在每个自定义的子Fragment中重写onAttach方法

 @Override
		public void onAttach(Activity activity) {
			super.onAttach(activity);
			((MainActivity) activity).onSectionAttached(2);
		}

            这样就实现了切换Fragment的功能,demo中的PlaceholderFragment类也可以删掉了。

备注:

            记得当时遇到了一个bug,是说这里

                 fragmentManager
                .beginTransaction()
                .replace(R.id.container,
                        new CheckinFragment()).commit();

            的replace()函数参数是Fragmen而当前是 AFragment BFragment,报错

            原因:v4包没导,默认是import android.app.Fragment;

            改成:import android.support.v4.app.Fragment;

   

   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值