不知道大家是否发现大部分App首页都是使用多个Fragment配合底部RadiogGoup来实现的。当然也有可能使用ViewPager和RadioGroup的连动来实现。
现在我就跟大家分享一下我首页的框架搭建。
1.先创建Activity:
Activity布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:id="@+id/fl"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<RadioGroup
android:id="@+id/rg"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Fragment1" />
<RadioButton
android:id="@+id/rb2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Fragment2" />
<RadioButton
android:id="@+id/rb3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Fragment3" />
<RadioButton
android:id="@+id/rb4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Fragment4" />
</RadioGroup>
</LinearLayout>
2.创建4个Fragment,分别在4个Fragment的onCreateView中把布局加载进去,这里我就不贴代码了。
3.申明一个用来装Fragment的数组
private Fragment[] fragments = new Fragment[4];
4.在Activity中写一个用来创建Fragment对象的方法:
private Fragment createFragment(int position){
switch (position){
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
case 3:
return new Fragment4();
default:
return null;
}
}
这个方法是专门用来生成Fragment对象的方法。根据参数传入的Position来创建对应的Fragment。
5.既然有了Fragment就需要加载到Activity中来显示了,下面就是写显示Fragment的方法:
这里就需要用到FragmentManager这个类了通过getSupportFragmentManager()方法获得。
private void showFragment(int position,String tag,FragmentTransaction t){
if(fragments[position] == null){
fragments[position] = createFragment(position);
t.add(R.id.fl,fragments[position],tag);
}else{
t.show(fragments[position]);
}
t.commitAllowingStateLoss();
}
该方法中根据传进来的参数position来判断该显示哪一个Fragment,先判断数组中是否存在该Fragment,不存在通过createFragment()方法创建,然后通过FragmentTransaction的add()方法把Fragment添加进容器中,如果存在的话直接调用show()方法把Fragment显示出来。
(如果这样就不管了,会出现一个bug,当加载到容器中的Fragment被覆盖时,在想被显示就会显示不出来,所以当想show的时候先把所有Fragment先影藏)
6.影藏Fragment的方法:
private void hideFragment(FragmentTransaction t) {
for (Fragment fragment : fragments) {
if (fragment != null) {
t.hide(fragment);
}
}
7.给RadioGroup设置监听器rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
FragmentTransaction t = manager.beginTransaction();
hideFragment(t);
switch (checkedId) {
case R.id.rb1:
showFragment(0, “fragment1”, t);
break;
case R.id.rb2:
showFragment(1, “fragment2”, t);
break;
case R.id.rb3:
showFragment(2, “fragment3”, t);
break;
case R.id.rb4:
showFragment(3, “fragment4”, t);
break;
default:
break;
}
}
});
}
这样就大功告成了:
public class MainsActivity extends AppCompatActivity {
private RadioGroup rg;
private Fragment[] fragments = new Fragment[4];
private FragmentManager manager = getSupportFragmentManager();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mains);
rg = (RadioGroup) findViewById(R.id.rg);
rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
FragmentTransaction t = manager.beginTransaction();
hideFragment(t);
switch (checkedId) {
case R.id.rb1:
showFragment(0, "fragment1", t);
break;
case R.id.rb2:
showFragment(1, "fragment2", t);
break;
case R.id.rb3:
showFragment(2, "fragment3", t);
break;
case R.id.rb4:
showFragment(3, "fragment4", t);
break;
default:
break;
}
}
});
}
private Fragment createFragment(int position) {
switch (position) {
case 0:
return new Fragment1();
case 1:
return new Fragment2();
case 2:
return new Fragment3();
case 3:
return new Fragment4();
default:
return null;
}
}
private void showFragment(int position, String tag, FragmentTransaction t) {
if (fragments[position] == null) {
fragments[position] = createFragment(position);
t.add(R.id.fl, fragments[position], tag);
} else {
t.show(fragments[position]);
}
t.commitAllowingStateLoss();
}
private void hideFragment(FragmentTransaction t) {
for (Fragment fragment : fragments) {
if (fragment != null) {
t.hide(fragment);
}
}
}
}