App首页使用多个Fragment和RadioGroup连动

不知道大家是否发现大部分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);
            }
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值