调用getChildFragmentManager时出现的Bug

本文针对在Fragment中使用ViewPager出现的“Activity has been destroyed”异常,提供了详细的错误原因分析及修复方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


异常:

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,从而引发了上面的异常.


Process: com.chery.auto.media, PID: 8750 java.lang.IllegalStateException: Expected the adapter to be 'fresh' while restoring state. at androidx.viewpager2.adapter.FragmentStateAdapter.restoreState(FragmentStateAdapter.java:536) at androidx.viewpager2.widget.ViewPager2.restorePendingState(ViewPager2.java:350) at androidx.viewpager2.widget.ViewPager2.dispatchRestoreInstanceState(ViewPager2.java:375) at android.view.ViewGroup.dispatchRestoreInstanceState(ViewGroup.java:4013) at android.view.View.restoreHierarchyState(View.java:20995) at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:639) at androidx.fragment.app.Fragment.restoreViewState(Fragment.java:3010) at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:3001) at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:580) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:285) at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2180) at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2106) at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:2002) at androidx.fragment.app.FragmentManager$5.run(FragmentManager.java:524) at android.os.Handler.handleCallback(Handler.java:938) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7843) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1119)
最新发布
07-04
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值