优化多个Fragment切换出现的问题FragmentTabAdapter
来源:互联网 发布:淘宝网首页电脑版 编辑:程序博客网 时间:2024/05/17 03:02
我们在开发过程中经常会用到多个Fragment之间进行切换,刚开始是有一些开发者可能会用到这种单例方法:
if (mFragment != null) {
ft.hide(mFragment);
}
这种方法避免了多次多fragment进行实例化,实例化一次多次使用的优化方法,但是用这个话,经过我们测试的工作者的暴力测试就会出现问题,比如:多个fragment乱串的问题,因为这个用做的话fragment的生命周期可能会乱掉,所以这样的写法并不是做好的我最近研究了下网上的一些大神发现有一个更好的实现,而且生命周期稳定,书写方便,下面就是说下这个adapter:
public class FragmentTabAdapter implements RadioGroup.OnCheckedChangeListener {private List<Fragment> fragments; // 一个tab页面对应一个Fragmentprivate RadioGroup rgs; // 用于切换tabprivate FragmentActivity fragmentActivity; // Fragment所属的Activityprivate int fragmentContentId; // Activity中所要被替换的区域的idprivate int currentTab; // 当前Tab页面索引private OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener; // 用于让调用者在切换tab时候增加新的功能public FragmentTabAdapter(FragmentActivity fragmentActivity,List<Fragment> fragments, int fragmentContentId, RadioGroup rgs) {this.fragments = fragments;this.rgs = rgs;this.fragmentActivity = fragmentActivity;this.fragmentContentId = fragmentContentId;// 默认显示第一页FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();ft.add(fragmentContentId, fragments.get(0));ft.commit();rgs.setOnCheckedChangeListener(this);}@Overridepublic void onCheckedChanged(RadioGroup radioGroup, int checkedId) {for (int i = 0; i < rgs.getChildCount(); i++) {if (rgs.getChildAt(i).getId() == checkedId) {// 如果设置了切换tab额外功能功能接口if (null != onRgsExtraCheckedChangedListener) {onRgsExtraCheckedChangedListener.OnRgsExtraCheckedChanged(radioGroup, checkedId, i);}Fragment fragment = fragments.get(i);FragmentTransaction ft = obtainFragmentTransaction(i);getCurrentFragment().onPause(); // 暂停当前tab// getCurrentFragment().onStop(); // 暂停当前tabif (fragment.isAdded()) {// fragment.onStart(); // 启动目标tab的onStart()fragment.onResume(); // 启动目标tab的onResume()} else {ft.add(fragmentContentId, fragment);}showTab(i); // 显示目标tabft.commit();}}}/** * 切换tab * * @param idx */public void showTab(int idx) {for (int i = 0; i < fragments.size(); i++) {Fragment fragment = fragments.get(i);FragmentTransaction ft = obtainFragmentTransaction(idx);if (idx == i) {ft.show(fragment);} else {ft.hide(fragment);}ft.commit();}currentTab = idx; // 更新目标tab为当前tab}/** * 获取一个带动画的FragmentTransaction * * @param index * @return */private FragmentTransaction obtainFragmentTransaction(int index) {FragmentTransaction ft = fragmentActivity.getSupportFragmentManager().beginTransaction();// 设置切换动画// if (index > currentTab) {// ft.setCustomAnimations(R.anim.slide_right_in,// R.anim.slide_left_out);// } else {// ft.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_right_out);//// }return ft;}public int getCurrentTab() {return currentTab;}public Fragment getCurrentFragment() {return fragments.get(currentTab);}public OnRgsExtraCheckedChangedListener getOnRgsExtraCheckedChangedListener() {return onRgsExtraCheckedChangedListener;}public void setOnRgsExtraCheckedChangedListener(OnRgsExtraCheckedChangedListener onRgsExtraCheckedChangedListener) {this.onRgsExtraCheckedChangedListener = onRgsExtraCheckedChangedListener;}/** * 切换tab额外功能功能接口 */public static class OnRgsExtraCheckedChangedListener {public void OnRgsExtraCheckedChanged(RadioGroup radioGroup,int checkedId, int index) {}}}这个适配器可以节省我们挺多代码的,我们在FragmentActivity中可以这样写:
首先新建一个集合用于存放fragment:
public List<Fragment> fragments = new ArrayList<Fragment>();
在这个里面的按钮都是用的RadioGroup和RadioButton:
虽然这里的RadioButton的ID没有用但是还是要写的,不然的话适配器分不清你到底点击了哪一个:
然后就是下面的这个:
TabOrderFragment,
TabStatisticsFragment
TabDishFragment
TabMoreFragment这是四个fragment放到集合中
R.id.tab_content是你要替换的布局的ID
mTabsRg是RadioGroup的对象;这样就可以了不用做其他什么操作了呢
</pre><pre>
fragments.add(new TabOrderFragment());fragments.add(new TabStatisticsFragment());fragments.add(new TabDishFragment());fragments.add(new TabMoreFragment());mTabAdapter = new FragmentTabAdapter(this, fragments, R.id.tab_content, mTabsRg);
0 0
- 优化多个Fragment切换出现的问题FragmentTabAdapter
- 解决当使用hide()和show()在多个Fragment 切换时,出现的重叠问题
- android 使用fragment切换,出现fragment重叠的问题
- 多个Fragment之间的切换
- 解决切换Fragment出现卡顿的问题
- Fragment切换的问题
- Android Fragment 切换多个界面 重叠问题 隐藏问题
- 对Fragment切换的优化
- 多个Fragment使用show和hide来切换时的画面重叠的问题
- 笔记整理-困扰多时的多个Fragment横竖屏切换的问题
- viewpager+fragment互相切换出现空白问题
- 1Activity+多个Fragment模式下进行横竖屏切换的问题及解决方式
- Android学习之解决多个Fragment切换时重新实例化的问题
- 当多个fragment来回切换时,getActivity = null的问题
- Android解决多个Fragment切换时布局重新实例化问题(挺详细的)
- 多个Fragment切换效果
- Activity多个fragment切换
- Fragment-Fragment切换的数据刷新问题
- Android开发学习笔记之通过反射技术修改listview的快速滑块图像
- Unknown column 's1' in 'field list'
- 相册制作软件--4月精选婚纱相册模板{H1.爱的天空}样片
- 10招教你完全识别IDC骗子
- Codeforces Round #135 (Div. 2) D 树形dp
- 优化多个Fragment切换出现的问题FragmentTabAdapter
- centos7 安装 vnc
- Java中equals和==的区别
- oracle中pl/sql编程案例
- Java Web高级特性之(四)过滤器、监听器、拦截器的区别
- 单链表综合实例 --QVector类的实现
- 基于JOS 80x86 的堆栈切换简要分析
- Nodejs Monog 学习笔记
- Java学习笔记——异常中的继承问题