zoukankan      html  css  js  c++  java
  • 调用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。从而引发了上面的异常.


  • 相关阅读:
    hdu1151 二分图(无回路有向图)的最小路径覆盖 Air Raid
    二分图多重匹配问题
    二分图最大匹配问题及其扩展
    ZOJ3741 状压DP Eternal Reality
    POJ2699:The Maximum Number of Strong Kings(枚举+贪心+最大流)
    POJ2396:Budget(带下界的网络流)
    POJ2391:Ombrophobic Bovines(最大流+Floyd+二分)
    POJ1637:Sightseeing tour(混合图的欧拉回路)
    URAL1277 Cops and Thieves(最小割)
    Leetcode 44. Wildcard Matching
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7274839.html
Copyright © 2011-2022 走看看