切换Fragment避免重复加载


现在市面上很多手机应用都会有一个非常类似的功能,就是屏幕下方有一行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>


FrameLayout作为容器装载Fragment,这里简单做三个Fragment就好了,就不放代码了。然后该初始化的初始化,该findViewById的 findViewById,然后也是开启个事务,把我们的几个Fragment添加到一个ArrayList中。PagerOne,PagerTwo,PagerThree就是我们说的三个Fragment。
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 {
            //显示,更新数据
        }
    }

恩,这样就没毛病了。




  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值