一直以来大概做带有导航类的应用的时候,都是使用TabActivity,但是,最新的SDK把TabActivity标成了deprecated,那只能重新寻找替代方案了,目前网上说的方案都是很混乱的
Fragment翻译过来叫碎片,但是我个人觉得可以理解为具有生命周期的View
由于Fragment是3.0以后的东西,对于适应低版本,那我们只能使用谷歌官方提供的android-support-v4.jar这个包了,最快捷的办法就是右击工程名,选择Android Tools——add support library...,即可添加这个包了
由于3.0以下的Activity里面没有对Fragment的支持,所以选择继承android-support-v4.jar包中的FragmentActivity,其功能跟3.0及以后的版本的Activity的功能一样
DEMO下载:
底部导航加顶部导航,使用FragmentTabHost,Fragmetn,FragmentActivity组成,代码已经打包上传了
1、首先,底部导航的实现,FragmentTabHost和以前的TabHost的区别就是增加了对Fragment的支持,这里的实现和其他使用TabActivity是一样的,只是选项卡的切换已经从activity变成fragment了
2、这里主要讲一下顶部导航的实现,为了让大家对fragment更好的理解,这里我没有采用FragmentTabHost,而是放了三个Button
package
com.yyb.fragmenttest;
import
android.os.Bundle;
import
android.support.v4.app.FragmentTabHost;
import
android.support.v4.app.FragmentTransaction;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.view.View.OnClickListener;
public
class
Fragment1
extends
BaseFragment
implements
OnClickListener{
public
static
BaseFragment newInstance(
int
index) {
BaseFragment fragment =
new
Fragment1();
Bundle args =
new
Bundle();
args.putInt(
"index"
, index);
fragment.setArguments(args);
fragment.setIndex(index);
return
fragment;
}
private
View layoutView;
private
FragmentTabHost mTabHost;
@Override
public
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
}
@Override
public
View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
layoutView = inflater.inflate(R.layout.fragment_tabs,
null
);
layoutView.findViewById(R.id.button1).setOnClickListener(
this
);
layoutView.findViewById(R.id.button1).setSelected(
true
);
layoutView.findViewById(R.id.button2).setOnClickListener(
this
);
layoutView.findViewById(R.id.button3).setOnClickListener(
this
);
if
(savedInstanceState ==
null
){
BaseFragment fragment = (BaseFragment)getChildFragmentManager().findFragmentByTag(
0
+
""
);
// getActivity().getSupportFragmentManager().findFragmentByTag(index+"");
if
(fragment==
null
){
init(
0
);
}
}
return
layoutView;
}
private
void
init(
int
index) {
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
ft.add(R.id.realtabcontent, Fragment11.newInstance(index) ,index+
""
);
//将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
//设置动画效果
ft.commit();
//提交
}
@Override
public
void
onClick(View v) {
allNoSelect();
switch
(v.getId()) {
case
R.id.button1:
placeView(
0
);
break
;
case
R.id.button2:
placeView(
1
);
break
;
case
R.id.button3:
placeView(
2
);
break
;
default
:
break
;
}
v.setSelected(
true
);
}
private
void
allNoSelect() {
layoutView.findViewById(R.id.button1).setSelected(
false
);
layoutView.findViewById(R.id.button2).setSelected(
false
);
layoutView.findViewById(R.id.button3).setSelected(
false
);
}
public
void
placeView(
int
index){
BaseFragment fragment = (BaseFragment)<span style=
"color: #ff0000;"
>getChildFragmentManager()</span>.findFragmentByTag(index+
""
);
// getActivity().getSupportFragmentManager().findFragmentByTag(index+"");
//得到一个fragment 事务(类似sqlite的操作)
FragmentTransaction ft = getChildFragmentManager().beginTransaction();
if
(fragment ==
null
) {
switch
(index) {
case
0
:
fragment = Fragment11.newInstance(index);
return
;
case
1
:
fragment = Fragment11.newInstance(index);
break
;
case
2
:
fragment = Fragment11.newInstance(index);
break
;
default
:
return
;
}
}
ft.replace(R.id.realtabcontent, fragment,index+
""
);
//将得到的fragment 替换当前的viewGroup内容,add则不替换会依次累加
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
//设置动画效果
ft.addToBackStack(
null
);
ft.commit();
//提交
}
}
|
这里有个FragmentTransaction(事务),这个是Fragment切换的核心类,它有两个方法:replace,add,一个是替换Fragment,一个是添加Fragment,两者的区别是:replace=remove掉旧fragment,add新的fragment
FragmentManager(碎片管理器),用来管理当前Activity中所有的Fragment
每次替换或者添加后,都要commit一样,才能算一个完整的事务,这里用了Fragment嵌套,还要注意一个问题,由于我当时没注意,导致想了好久才找出问题的原因所在,如果你是嵌套了Fragment,那么使用FragmentManager的一定要注意你当前的Fragment是属于嵌套的fragment还是顶层的Fragment,如果是顶层Fragment,那么你调用FragmentManager的时候,应该这样写getActivity().getSupportFragmentManager(),如果是嵌套的fragment那么应该这样写getChildFragmentManager()
Fragment基础:http://www.cnblogs.com/TerryBlog/archive/2012/02/17/2355753.html