几行代码解决RadioGroup+Fragment的重叠问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoyantan/article/details/70856246

一直以来,项目的主页面框架都喜欢用RadioGroup+Fragment,解决Fragment重叠也是各种方法都有,今天讲一个使用起来特别简单的方法。灵感来自于FragmentPagerAdapter。先看看使用的方法:

public class MainActivity extends AppCompatActivity {

    private FlexibleRadio rgMain;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rgMain = (FlexibleRadio) findViewById(R.id.rg_main);
        rgMain.setAdapter(new FragmentRadioAdapter(getSupportFragmentManager()) {
            @Override
            public int getCount() {
                return 3;
            }

            @Override
            public Fragment getItem(int position) {
                switch (position) {
                    case 0 :
                        return new Fragment1();
                    case 1 :
                        return new Fragment2();
                    case 2 :
                        return new Fragment3();
                }
                return null;
            }

            @Override
            public int getContainerId() {
                return R.id.fl_container;
            }
        });
    }
}

怎么样,使用很简单吧,下面看看是如何封装的。

public abstract class FragmentRadioAdapter {

    private int currentItem = -1;
    private FragmentManager mFragmentManager;
    private FragmentTransaction mTransaction;

    public FragmentRadioAdapter(FragmentManager mFragmentManager) {
        this.mFragmentManager = mFragmentManager;
    }

    public abstract int getCount();

    public abstract Fragment getItem(int position);

    public abstract int getContainerId();

    public void setCurrentItem(int position) {
        if (currentItem != position) {
            mTransaction = mFragmentManager.beginTransaction();
            Fragment fragment = getFragmentOfPosition(position);
            if (!fragment.isAdded()) {
                mTransaction.add(getContainerId(), fragment, getTag(position));
            }
            mTransaction.show(fragment);
            if (currentItem != -1) {
                mTransaction.hide(getFragmentOfPosition(currentItem));
            }
            mTransaction.commitNowAllowingStateLoss();
            currentItem = position;
            mTransaction = null;
        }
    }


    private Fragment getFragmentOfPosition(int position) {
        Fragment fragment = mFragmentManager.findFragmentByTag(getTag(position));
        if (fragment == null) {
            fragment = getItem(position);
        }
        return fragment;
    }

    public String getTag(int position) {
        return "FragmentRadioAdapter:" + getContainerId() + ":" + position;
    }
}

这是个模仿FragmentPagerAdapter实现的适配器,要了解实现不重叠的原理,请看上一篇文章:正确使用FragmentPagerAdapter,避免Fragment重叠问题

public class FlexibleRadio extends RadioGroup {
    public FlexibleRadio(Context context) {
        super(context);
    }

    public FlexibleRadio(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setAdapter(final FragmentRadioAdapter adapter) {
        adapter.setCurrentItem(0);
        setOnCheckedChangeListener(new OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
                for (int i = 0; i < group.getChildCount(); i++) {
                    if(group.getChildAt(i).getId() == checkedId) {
                        adapter.setCurrentItem(i);
                    }
                }
            }
        });
    }
}

使用的时候直接把上面两个类的代码粘贴过去,然后直接使用就行了。关于如何杀进程测试内存重启测试Fragment重叠。如图:这里写图片描述
进入二级页面,点击标识的差号即可。

猜你喜欢

转载自blog.csdn.net/xiaoyantan/article/details/70856246
今日推荐