您的位置:首页 > 编程语言

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

2017-04-27 15:23 561 查看
一直以来,项目的主页面框架都喜欢用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重叠。如图:


进入二级页面,点击标识的差号即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android Fragment重叠
相关文章推荐