Activity内切换fragment实现底部菜单切换遇到的坑

1、一般说来,app底部导航都会设计为5个菜单,可以使用textView,也可使用radioButton,这里我选择用radioButton,给radioButton直接设置selector就可以实现背景变换。

2、接下来说说,fragment切换的实现方式。大家都知道切换fragment有两种方式:

replace直接替换:

fragmentManager.beginTransaction().replace(R.id.ll_container, fg_home).addToBackStack(null).commitAllowingStateLoss();

这种方式的特点是,每次切换时,前一个fragment都会执行onDestroyView()方法,新的fragment会重新创建,执行onCreateView()方法。缺点就是每次切换都会重新调用fragment的生命周期,如果在初始化方法里面加载数据的话,势必会重复调用,造成资源浪费。所以我在项目中放弃了这种方式,选择下面第二种方式。但素,话说回来,replace占用资源虽然会多一些,但是不存在add方法的bug。

② 另外一种是add方式来进行show和add。使用add方法add到activity里面的fragment的对象并不会被销毁,也就是它仍然在activity中存在,只是应用被置为null而已。此时如果重新为fragment赋值,其hide方法和show方法都不会生效。如果这种情况下,一个activity中有多个fragment,很可能出现多个fragment层叠而不能正常的显示或者隐藏。所以这里使用以下方法来切换:

 1     protected void switchFragmentNoBack(FragmentSociax fragmentInstance) {
 2         currentFragment=fragmentInstance;
 3         FragmentTransaction t = getSupportFragmentManager().beginTransaction();
 4         List<Fragment> fragments = getSupportFragmentManager().getFragments();
 5         if(fragments!=null){
 6             for (int i = 0; i < fragments.size(); i++) {
 7                 FragmentSociax tempFragment = (FragmentSociax) getSupportFragmentManager().findFragmentByTag(fragments.get(i).getClass().getName());
 8                 if (tempFragment != null) {
 9                     if (tempFragment.getClass().getName().equals(fragmentInstance.getClass().getName())) {
10                         t.show(tempFragment);
11                     } else {
12                         t.hide(tempFragment);
13                     }
14                 }
15             }
16         }
17         Fragment fragmentTarget = getSupportFragmentManager().findFragmentByTag(fragmentInstance.getClass().getName());
18         if (fragmentTarget == null && !fragmentInstance.isAdded()) {
19             t.add(R.id.ll_container, fragmentInstance, fragmentInstance.getClass().getName());
20         }
21         t.commitAllowingStateLoss();
22     } 

使用了一段时间后,发现友盟上面追踪的有很多fragment already added的崩溃。复现问题,原来快速点击某个tab两次时一定会出现此崩溃。系统解释:

Schedules a commit of this transaction. The commit does not happen immediately; it will be scheduled as work on the main thread to be done the next time that thread is ready.

意思是刚刚进行的操作没有立即生效,所以解决办法是:调用 getSupportFragmentManager.executePendingTransactions()。放在上面21行代码之后。

总结:两种方式各有利弊,使用过程中注意规避每种方式里面的坑,正确高效的使用fragment~

By LiYing

原文地址:https://www.cnblogs.com/widgetbox/p/8320793.html

时间: 2024-10-02 07:38:06

Activity内切换fragment实现底部菜单切换遇到的坑的相关文章

Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换

Android典型界面设计——FragmentTabHost+Fragment实现底部tab切换 Android学习笔记:TabHost 和 FragmentTabHost

FragmentTabHostBottomDemo【FragmentTabHost + Fragment实现底部选项卡】

版权声明:本文为博主原创文章,未经博主允许不得转载. 前言 使用FragmentTabHost实现底部选项卡效果. 备注:该Demo主要是演示FragmentTabHost的一些设置和部分功能,实际中需要参考其他Demo. 效果图 代码分析 1.该Demo中采用的是FragmentTabHost的布局方案之一[命名为非常规布局写法]:[建议使用常规布局写法,见<FragmentTabHostTopDemo[FragmentTabHost固定宽度且居中]>] 2.未使用自定义的FragmentT

底部菜单中用fragment,fragment中套用PagerSlidingTabStrip,切换底部时viewpager消失

今天在开发时遇上一个问题,我用的框架是底部菜单四个按钮+fragment,然后主页中的fragment套用了PagerSlidingTabStrip,PagerSlidingTabStrip中是用Viewpager+Tab组合进行点击切换页面或者滑动切换菜单,就这样实现了我想要的功能,可是当我在底部菜单中相互切换时,PagerSlidingTabStrip中的Viewpeger消失了,这是怎么产生的呢?官方的Demo没有组合起来使用,所以没有问题,现在组合后问题就出来了,我换用了几个方法都没有解

用Fragment实现如新浪微博一样的底部菜单的切换

像我这个有强迫症的人来说,自从TabActivity抛弃之后,再使用看到一个个警告和一条条划着的横线,心里很不舒服,现在终于下定决心用Fragment来替换掉TabActivity了!我的研究成果如下: 首先是MainActivity,它需要继承FragmentActivity(这里是指:版本是3.0之前的继承FragmentActivity,3.0版本之后的继承Activity就可以),对于FragmentActivity的声明周期我就不过多介绍了,和Activity差不了多少,自己也能弄明白

Activity嵌套多个Fragment实现横竖屏切换

一.上图 二.需求 近期项目遇到个横竖屏切换的问题,较为复杂,在此记之. 1.Activity中竖屏嵌套3个Fragment,本文简称竖屏FP1,FP2,FP3. 2.其中竖屏FP1与FP2可以切换为横屏的FL1,FL2,即竖屏FP1切换到对应的横屏FL1,竖屏FP2对应切换到横屏FL2. 3.FP3不允许横竖屏切换. 4.竖屏FP1,FP2,FP3用ViewPager实现左右滑动切换. 5.横屏的FL1,FL2用布局中的切换按扭实现左右切换,不允许滑动切换. 看到这需求有点儿晕菜了吧!!!呵呵

Fragment碎片频繁来回切换的时候报java.lang.IllegalStateException: No activity

出现这个问题的原因是因为使用的transcation.replace(fragmentTwo);的方式进行碎片切换的. 解决方案是使用add和show.hide方法组合实现碎片的切换(应该是显示.隐藏). 我这里使用的是RadioButton控件的Id值. /** * 切换碎片:使用show和hide以及add,不要使用replace(频繁来回切换的时候容易发生内存溢出的错误) */ public void onTabSelected(int radioGroupId) { //开启一个事务 F

Android项目开发实战之使用Fragment和FragmentTabHost搭建底部菜单(一)

学习在于实用,只有把自己学到的东西真正的融入到我们的开发中,并且使用的得心应手,那才是真正的掌握.而想把技术使用的得心应手并不是一蹴而就的,需要不断的巩固自己的知识体系,需要大量的实战练习,当然还不能缺少你的专研和耐心. 但是很多小伙伴们并不一定学过的知识都掌握了,而且相信很多伙伴们即使学习一种技术也还是停留在读过,看过,学习过,并没有真正的实战过,所以当时学习的技术觉得自己真正的学会了,搞懂了,而且信心满满的觉得自己可以不必在练习了,这是不对的,因为一时的学习并没有立马转变成为你的技能,而是需

tabhost实现android菜单切换

做APP项目已经有半个月了.慢慢地熟悉了这个开发环境和开发套路. 虽然是摸着石头过河.但也渐渐看到了水的深度! 作为一个电商项目APP,势必会涉及究竟部菜单条的功能.自己实现这个功能的过程是崎岖的,最总完毕之后才发现这样的崎岖对于自己的学习是非常有帮助的! 对于这部分的探索拿来和大家分享,希望能够相助于大家! 实现app底部菜单条的方法有非常多种,亲身尝试了tabhost和fragment两种方式,终于还是成功做成了tabhost,拿来和大家分享. 事实上tabhost实现底部菜单条的功能非常e

如何进行fragment中的来回切换?

本文选自StackOverflow(简称:SOF)精选问答汇总系列文章之一,本系列文章将为读者分享国外最优质的精彩问与答,供读者学习和了解国外最新技术,本文为大家讲解如何进行fragment中的来回切换. 问:Ijaz Ahmed 我想要对fragment中的fragment进行操作,在按后退按钮的时候出现了问题.应用程序主屏幕上有很多按钮,按下每个按钮都会出现新的fragment(它也被包含在另一个fragment内).按下按钮1(已替换fragment),可以进行动态的添加或者是替换片段.如