我的Android应用出现问题。 使用Android 7.1或8.0的某些设备通常会报告IllegatStateException崩溃。 我在Google上进行了搜索,并试图对其进行多次修复,但没有用。 我不知道是什么原因导致了崩溃。 如果有时间请帮助我。 这是一份完整的报告:
java.lang.IllegalStateException:
at android.support.v4.app.FragmentManagerImpl.addFragment (FragmentManagerImpl.java:60)
at android.support.v4.app.BackStackRecord.executeOps (BackStackRecord.java:137)
at android.support.v4.app.FragmentManagerImpl.executeOps (FragmentManagerImpl.java:38)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether (FragmentManagerImpl.java:112)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute (FragmentManagerImpl.java:89)
at android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManagerImpl.java:21)
at android.support.v4.app.FragmentManagerImpl$1.run (FragmentManagerImpl.java:2)
at android.os.Handler.handleCallback (Handler.java:869)
at android.os.Handler.dispatchMessage (Handler.java:101)
at android.os.Looper.loop (Looper.java:206)
at android.app.ActivityThread.main (ActivityThread.java:6733)
at java.lang.reflect.Method.invoke (Method.java)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:845)
我有一个主要活动包含一个FrameLayout。 我使用以下FrameLayout通过以下方式显示5个不同的片段:
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
switch (button) {
case 1:
ft.replace(R.id.mainframe, fragment1, FRAGMENT1_TAG);
break;
case 2:
ft.replace(R.id.mainframe, fragment2, FRAGMENT2_TAG);
break;
case 4:
Fragment fragment4 = new Fragment();
ft.replace(R.id.mainframe, fragment4, FRAGMENT4_TAG);
break;
}
ft.setTransition(FragmentTransaction.TRANSIT_ENTER_MASK);
ft.commit();
必须保存一些片段以供以后还原(片段1-> 3),一些片段必须刷新(创建新实例)(片段4-> 5)。 此外,在片段4和5上,有一个viewpager和一个按钮数组,每个按钮都在页面之间移动。 Viewpagers的代码:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
viewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager(), new Fragment[] {
new Page1(),
new Page2()
}));
}
private void onButtonTap(Button btn) {
switch (btn.getId()) {
case R.id.button1:
viewPager.setCurrentItem(0, true);
break;
case R.id.button2:
viewPager.setCurrentItem(1, true);
break;
}
}
我还定义了两个从Dialog派生的类,并使用Toast。 我无法在模拟器或设备上复制。它仅在少数设备上发生。 我的代码有什么问题吗? 请帮我。崩溃持续了很长时间,我需要摆脱它。 我期待着您的回音。 非常感谢。
长
编辑1:这是我在片段1上调用ft.replace的地方
@Override
protected void onResume() {
// Check server connection to go back to the first fragment
if (!ConnectivityReceiver.getInstance().isServerConnected()) {
Fragment currentFragment = getSupportFragmentManager().findFragmentById(R.id.main_frame);
if (currentFragment != null &&
(FRAGMENT_4_TAG.equals(currentFragment.getTag()) || FRAGMENT_5_TAG.equals(currentFragment.getTag())) && isActive()) {
.....
ft.replace(fragment1);
}
}
}
答案 0 :(得分:0)
根据源代码,如果您尝试添加已经是管理者成员的addFragment
,则"Fragment already added"
方法将引发该异常并显示消息Fragment
。
现在,我可以看到的FragmentManagerImpl
源代码的版本看起来与堆栈跟踪完全不同,因此这有点猜测。但是我怀疑问题在于,当ft.replace
或fragment2
已经是布局的一部分时,您可能正在调用它们。在某些情况下....