• 调用getChildFragmentManager时出现的Bug



    异常:

    java.lang.IllegalStateException: Activity has been destroyed
    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1342)
    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
    at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:578)

    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139)

    at android.support.v4.view.ViewPager.populate(ViewPager.java:1012)

    at android.support.v4.view.ViewPager.populate(ViewPager.java:881)

    at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:434)

    at com.itcode.reader.fragment.MineFragment.onViewCreated(MineFragment.java:49)

    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:925)

    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088)

    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)

    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444)

    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429)

    at android.os.Handler.handleCallback(Handler.java:615)

    at android.os.Handler.dispatchMessage(Handler.java:92)

    at android.os.Looper.loop(Looper.java:137)

    场景:

    Fragment中有一个ViewPager,ViewPager的每一个pagerFragment

    调用代码:

    @Override

    public void onViewCreated(View view, Bundle savedInstanceState) {

    super.onViewCreated(view, savedInstanceState);

    viewPager = (ViewPager) view.findViewById(R.id.pager);

    ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager(),TITLE);

    viewPager.setAdapter(adapter);

    TabPageIndicator mIndicator = (TabPageIndicator) view.findViewById(R.id.indicator);

    mIndicator.setViewPager(viewPager);

    }

    解决方式:

    在每一个调用getChildFragmentManager()fragment中增加:

    @Override

    public void onDetach() {

    super.onDetach();

    try {

    Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");

    childFragmentManager.setAccessible(true);

    childFragmentManager.set(thisnull);

    catch (NoSuchFieldException e) {

    throw new RuntimeException(e);

    catch (IllegalAccessException e) {

    throw new RuntimeException(e);

    }

    }

    就可以!


    异常解析:

    假设你细致查看Fragment的实现,你会看到当fragment进行到detached状态时,它会重置它的内部状态。

    然而,它没有重置mChildFragmentManager.这是当前版本号support库的一个bug.

    这导致在Fragment又一次attach时,它(fragment)没有又一次attachm childFragmentManager。从而引发了上面的异常.


  • 相关阅读:
    shell脚本编程练习
    linux中()、[]、{}、(())、[[]]等各种括号的使用
    Linux Shell 变量自加
    while read line [linux] shell 学习
    踢出某正在访问的用户||永久禁止某IP访问
    linux设置 自定义脚本开机启动
    syntax error: unexpected end of file完美解决方案
    Linux利用nc命令脚本批量检测服务器指定端口是否开放
    41-贪心算法
    38-动态规划
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7274839.html
Copyright © 2020-2023  润新知