几行代码解决RadioGroup+Fragment的重叠问题
2017-04-27 15:23
561 查看
一直以来,项目的主页面框架都喜欢用RadioGroup+Fragment,解决Fragment重叠也是各种方法都有,今天讲一个使用起来特别简单的方法。灵感来自于FragmentPagerAdapter。先看看使用的方法:
怎么样,使用很简单吧,下面看看是如何封装的。
这是个模仿FragmentPagerAdapter实现的适配器,要了解实现不重叠的原理,请看上一篇文章:正确使用FragmentPagerAdapter,避免Fragment重叠问题
使用的时候直接把上面两个类的代码粘贴过去,然后直接使用就行了。关于如何杀进程测试内存重启测试Fragment重叠。如图:
进入二级页面,点击标识的差号即可。
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重叠。如图:
进入二级页面,点击标识的差号即可。
相关文章推荐
- 通过RadioGroup切换Fragment,快速切换会导致Fragment重叠或者IndexOutOfBoundsException: Invalid index 1, size is 1的问题
- Android RadioGroup中设置默认选中RadioButton 后,选中两个的问题 解决方法
- 解决RadioButton与RadioGroup在某些机型偏移问题
- fragment+RadioGroup实现底部导航栏 多个 fragment 重影问题
- Android fragment 重叠问题——通过hide,show方式导致的解决方法
- 解决RadioGroup和CheckboxGroup的不能赋值问题
- Fragment 重叠 遮盖问题 完美解决
- Android RadioGroup中设置默认选中RadioButton 后,选中两个的问题 解决方法
- RadioGroup里设置RadioButton为初始的都不选中状态及设置默认选中出现的问题及解决方法
- 解决某些手机RadioGroup中的RadioButton不居中(右移)问题
- [转]Android fragment 重叠问题——通过hide,show方式导致的解决方法
- Android RadioGroup中设置默认选中RadioButton 后,选中两个的问题 解决方法
- extjs 3.0 radioGroup的问题解决办法
- 解决RadioButton+FragmentPagerAdapter+Fragment切换页面数据加载的问题
- 基本上,把switch,用设计模式代替,肯定是bug和过度设计。想想,本来修改一个文件几行代码可以解决的问题,变成修改3-6个类才能实现一样的功能。不是傻是什么?
- 解决Fragment重叠问题
- Android ListView中的项中包含RadioGroup时,RadioButton混乱选中的问题的解决方法
- Android fragment 重叠问题的解决方法
- 解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
- Fragment页面加载混乱 视图重叠问题 如何优雅的解决