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;