这两天在使用Fragment做播放器里的播放列表和歌词显示两个界面的替换与更新时发现了很多问题,在此记录下问题及解决方法:

1.多个Fragment在replace后(并且都加入了后退栈ft.addToBackStack(null)),通过点击按钮事件移除顶层的fragment(使用remove方法),返回后的fragment的oncreatview方法有执行,但是页面仍然没法自行更新数据,页面空白,UI控件都消失了。

解决:不用remove方法,改用通过popBackStack()方法直接将栈顶的fragment弹出,然后直接恢复到要返回的那个fragment。

1
getSupportFragmentManager().popBackStack();

2.使用popBackStack()方法后,页面控件恢复了,但是数据并没有同步更新。

解决:这个问题困扰了很久,后来讲replace方法改成了add方法,并且在add之前将原先的fragment隐藏掉hide。这样在点击按钮收回播放列表的fragment后,返回的歌词fragment的显示进度是同步的了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 打开播放列表
private void btnClick_playinglist()
{
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    Fragment fragment = new PlayingListFragment();
    if (isOpenPlayingList)//播放类表是否已打开
    {
        getSupportFragmentManager().popBackStack();
        mPlaying_img_openlist.setImageResource(R.drawable.icon_playing_img_openlist);
        isOpenPlayingList = false;
    }
    else
    {
        ft.hide(mFragment);
        ft.add(R.id.playing_fragment_layout, fragment);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.addToBackStack(null);
        mFragment = fragment;
        mPlaying_img_openlist.setImageResource(R.drawable.icon_playing_img_openlist_press);
        isOpenPlayingList = true;
    }
    ft.commit();
}

3.通过按钮点击可以正常弹出顶层的播放列表fragment了,同时歌词界面的fragment仍然同步更新。但是用按钮点击打开播放列表fragment,然后用back键返回,第一次正常,多次后歌词fragment就开始变成空白。将fragment的背景颜色修改成红色,异常界面就是红色。由此可见,通过back键返回的fragment仍然没有恢复和更新。

解决:这个不清楚具体原因,应该是使用back返回键和通过调用popBackStack()方法来移除fragment的机制不一样所导致的。这个找不到具体的解决办法,只能先采用规避方法,通过重写back监听方法,进而调用popBackStack()解决了这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//重写监听back键按钮
@Override
public void onBackPressed()
{
    getSupportFragmentManager().popBackStack();
    if (isOpenPlayingList)//判断播放列表是否打开
    {
        mPlaying_img_openlist.setImageResource(R.drawable.icon_playing_img_openlist);
        isOpenPlayingList = false;
    }
    else
    {
        super.onBackPressed();
    }
}

关于fragment backstate的运用相关推荐

  1. 关于fragment backState的原理

    在使用Fragment的时候我们一般会这样写: FragmentTransaction transaction = getSupportFragmentManager().beginTransacti ...

  2. 关于fragment backstate的介绍

    Transaction BackStack and its management Posted by Achin | Filed under Android 19.09.2014 This is se ...

  3. Fragment之间传递数据的方式

    1.直接调用另一个Fragent对象的方法,两个Fragment之间高度耦合 2.采取接口回调的方式进行数据传递.即在一个fragment中创建一接口以及接口对应的set方法,在另一个fagment中 ...

  4. Android Fragment 调用宿主Activity 里面的方法

    方法 1 : 直接在Fragment 写 MainActivity main = (MainActivity) getActivity();main.xx; // xx 是 MainActivity ...

  5. java.lang.IllegalArgumentException: No view found for id 0x7f07005f (xx) for for fragment xxFragment

    问题的原因的是自己修改id 的时候弄错了修改下id 就好了 我的是用activity 加载fragment 使用的地方如下 ,确定下面的id 是否在布局中 transaction.add(R.id.c ...

  6. overridePendingTransition 方法在Fragment 中使用

    overridePendingTransition  方法在直接卸载Fragment 中无法识别 这个使用可以在前面添加getActivity 即可使用了 getActivity().override ...

  7. Fragment 使用 replace 的方式实现切换 以及切换的时候Fragment 生命周期

    这个主要代码在activity里面 如下 public class ReplaceActivity extends AppCompatActivity implements View.OnClickL ...

  8. Fragment 使用 show 和 hide 的方式实现切换 以及切换的时候Fragment 生命周期

    实现的效果如下图 主要的代码在activity 这里贴出来了 public class ShowActvity extends AppCompatActivity implements View.On ...

  9. ViewPager与Fragment结合使用,以及切换的时候Fragment 的生命周期

    下面要做的效果图下图 首先我们创建一个适配器如下 public class FraPagerAdapter extends FragmentPagerAdapter {private List< ...

最新文章

  1. LeetCode - 34. Search for a Range
  2. linux 查本机公网ip 网站接口 nmap工具
  3. java cmd 等待输入_JAVA:调用cmd指令(支持多次手工输入)
  4. php server 域名,php 关于如何获取域名或者IP地址的$_SERVER['']
  5. JS module的导出和导入 1
  6. mysql基本命令大全_Django 学习笔记之 如何设置和操作 mysql 数据库
  7. HashTable 简述
  8. Ubuntu Amarok乱码解决方案
  9. QXDM工具使用说明
  10. quartz之动态定时器实现
  11. 高颜值:Redis官方可视化工具,功能强大!
  12. 利用photoshop制作身份证复印件的流程
  13. 河海大学计算机信息学院2013年考研录取名单,河海大学地学院2013年考研录取名单...
  14. 敏捷开发产品管理系列之四:新产品研发
  15. SysY文法编译器前端设计实现
  16. java的jna电脑桌面背景_获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)...
  17. 一文彻底玩转Android通知栏消息通知
  18. 智慧家庭信息安全白皮书发布,推动智慧家庭叫好又叫座
  19. Statistics Foundations: 2 统计基础:2 Lynda课程中文字幕
  20. C++ 视频学习笔记

热门文章

  1. 园子里有没有介绍netframework3.0的
  2. 牛客网(剑指offer) 第六题 旋转数组的最小数字
  3. 痛与快乐有一个代码是什么_养一只真大型犬的生活是什么样的?铲屎官:痛并快乐着!...
  4. 【数据结构与算法】之深入解析“分割数组的最大值”的求解思路与算法示例
  5. 快手2020校园招聘秋招笔试--工程B试卷
  6. 2014年第五届蓝桥杯C/C++ A组国赛 —— 第二题:六角幻方
  7. 十六进制转float和“float转十六进制”经典代码
  8. 【Qt】QModbusDevice类
  9. 【ARM】Tiny4412裸板编程之静态库(libc.a)
  10. python小游戏代码_20行python代码的入门级小游戏