现在市面上很多手机应用都会有一个非常类似的功能,就是屏幕下方有一行Tab标签选项,点击不同的标签就可以切换到不同的界面:
这个在以前是用ActivityGroup(年代太久远了,那时候俺还木有毕业呢0.0),因为Fragment的种种优势和其灵活性,现在官方推荐的替代方法是用Fragment。
使用Fragment的话,我之前是先通过getSupportFragmentManager(),再beginTransaction()开启事务,FragmentTransaction中有add(),replace(),remove()三个方法,我之前是用replace方法每次替换掉之前的Fragment,但是我们会发现,使用replace()时,每次切换,Fragment都会重新创建,这样就比较不好了。从网上搜索发现可以通过show和hide方法避免重复加载(借鉴了郭霖大神的思路,但是他的方式在我的app里会出现重影)。So我换了一种实现方式。当然本质没有区别,还是通过一次将所有的Fragment添加到一个集合里,再通过隐藏和显示完成的。
布局文件还是RadioGroup嵌套RadioButton,代码随便看看就好啦
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.v_lzhiy.tablayout.HideFragmentActivity">
<FrameLayout
android:id="@+id/fl_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#f9f9f9"
android:gravity="center_horizontal"
android:orientation="horizontal"
android:padding="5dp"
>
<RadioButton
android:id="@+id/pager1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:background="@android:color/transparent"
android:button="@android:color/transparent"
android:drawableTop="@drawable/rb_me_selector"
android:textSize="18sp"
android:textColor="@drawable/bottom_radiobutton_selector"
android:drawablePadding="1dp"
android:gravity="center"
android:text="Home"/>
<RadioButton
android:id="@+id/pager2"
style="@style/BottomRadioButton"
android:text="探索"
android:drawableTop="@drawable/rb_me_selector"/>
<RadioButton
android:id="@+id/pager3"
style="@style/BottomRadioButton"
android:text="我"
android:drawableTop="@drawable/rb_me_selector"/>
</RadioGroup>
</LinearLayout>
fragmentManager = getSupportFragmentManager();
fragmentTransaction = fragmentManager.beginTransaction();
fragments = new ArrayList<>();
pagerOne = new PagerOne();
pagerTwo = new PagerTwo();
pagerThree = new PagerThree();
fragments.add(pagerOne);
fragments.add(pagerTwo);
fragments.add(pagerThree);
fragmentTransaction.add(R.id.fl_container,pagerOne);
fragmentTransaction.add(R.id.fl_container,pagerTwo);
fragmentTransaction.add(R.id.fl_container,pagerThree);
再把三个Fragment添加到FragmentTransaction中,是add不是replace哦。这样,我们就可以通过我们选择不同的Radiobutton通过显示与隐藏的方式切换Fragment了,但是在这之前,我们还要做一件事,三个Fragment都添加进去了,会出现重影……需要我们手动设置进入app时要显示哪一页,其余的隐藏。我这里是显示第一页:
radioGroup.check(R.id.pager1);
fragmentTransaction.show(pagerOne).hide(pagerTwo).hide(pagerThree);
fragmentTransaction.commit();
这样就显示了第一页,隐藏了其余两页。当我们切换RadioButton时,再显示该显示的隐藏其余的,switchFragment(int index)就是显示与隐藏的控制代码。
radioGroup.setOnCheckedChangeListener(new NestRadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(NestRadioGroup group, int checkedId) {
switch(checkedId){
case R.id.pager1:
switchFragment(0);
break;
case R.id.pager2:
switchFragment(1);
break;
case R.id.pager3:
switchFragment(2);
break;
}
}
});
}
/**
* 选择隐藏与显示的Fragment
* @param index 显示的Frgament的角标
*/
private void switchFragment(int index){
fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
for(int i = 0; i < fragments.size(); i++){
if (index == i){
fragmentTransaction.show(fragments.get(index));
}else {
fragmentTransaction.hide(fragments.get(i));
}
}
fragmentTransaction.commit();
}
这样就可以避免每次切换都重新创建Fragment了,很简单吧,但是还有个问题,有时候我们切换的时候需要处理一些事情,比如刚开始是未登录状态,现在登录了,切换页面时要更新一些数据,那怎么办呢?Fragment里有个onHiddenChanged方法,是专门用来处理Fragment显示与隐藏的事件的。
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (hidden){
//隐藏
}else {
//显示,更新数据
}
}
恩,这样就没毛病了。