【问题标题】:RuntimeException: java.lang.IllegalArgumentException with MainActivity.onStartRuntimeException: java.lang.IllegalArgumentException with MainActivity.onStart
【发布时间】:2018-02-27 00:08:23
【问题描述】:

可能与

重复
java.lang.IllegalArgumentException when switching fragments 
但问题的场景与这个链接不同。

这是我的代码

public class MainActivity extends AppCompatActivity{         
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.main_layout);
    bindWidgetsWithAnEvent();
 } 
private void bindWidgetsWithAnEvent() {
    tabsLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(final TabLayout.Tab tab) {
            setCurrentTabFragment(tab.getPosition());
            Log.d(TAG, "Position " + tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
            Log.d(TAG, String.valueOf(tab.getPosition()));
        }
    });
}
public void setCurrentTabFragment(int tabPosition) {
    switch (tabPosition) {
        case 0:
            replaceFragment(fragmentName);
            break;
        case 1:
            replaceFragment(fragmentName);
            break;
        default:
            break;
    }
}
public void replaceFragment(Fragment fragment) {
    FragmentManager fm = getSupportFragmentManager();
    FragmentTransaction ft = fm.beginTransaction();
    ft.replace(R.id.flContent, fragment);
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
    ft.commit();
}
@Override
protected void onStart() {
    super.onStart();
}
}

以下是谷歌控制台捕获的stacktrace,搜索后仍然没有得到解决方案。如果有人有更好的解决方案或有同样的问题,请告诉我。

java.lang.IllegalStateException:
  at android.support.v4.app.FragmentManagerImpl.checkStateLoss (FragmentManager.java:1842)
  at android.support.v4.app.FragmentManagerImpl.enqueueAction (FragmentManager.java:1860)
  at android.support.v4.app.BackStackRecord.commitInternal (BackStackRecord.java:650)
  at android.support.v4.app.BackStackRecord.commit (BackStackRecord.java:609)
  at com.safarifone.waafi.ui.activities.MainActivity.replaceFragment (MainActivity.java:354)
  at com.safarifone.waafi.ui.activities.MainActivity.setCurrentTabFragment (MainActivity.java:336)
  at com.safarifone.waafi.ui.activities.MainActivity$3.onTabSelected (MainActivity.java:303)
  at android.support.design.widget.TabLayout.dispatchTabSelected (TabLayout.java:1164)
  at android.support.design.widget.TabLayout.selectTab (TabLayout.java:1157)
  at android.support.design.widget.TabLayout.selectTab (TabLayout.java:1127)
  at android.support.design.widget.TabLayout$Tab.select (TabLayout.java:1426)
  at android.support.design.widget.TabLayout$TabView.performClick (TabLayout.java:1536)
  at android.view.View$PerformClick.run (View.java:20300)
  at android.os.Handler.handleCallback (Handler.java:815)
  at android.os.Handler.dispatchMessage (Handler.java:104)
  at android.os.Looper.loop (Looper.java:210)
  at android.app.ActivityThread.main (ActivityThread.java:5833)
  at java.lang.reflect.Method.invoke (Native Method)
  at java.lang.reflect.Method.invoke (Method.java:372)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1113)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:879)

我们将不胜感激

【问题讨论】:

  • 尝试使用 ft.commitAllowingStateLoss();安装 ft.commit(); stackoverflow.com/a/18345684/5069323
  • 尝试替换 ft.replace(R.id.flContent, fragment);用 ft.replace(R.id.flContent, fragment,fragment.getClass().getName());
  • @PratikTank 和 SagarVasoya 我会检查这些选项,但你确定这会解决问题吗?因为我自己无法重现问题。这已被 Google Play 控制台捕获。

标签: android performance android-layout android-studio android-fragments


【解决方案1】:

基本上,当您替换片段时,它会丢失其状态,这是 Android 操作系统中众所周知的错误,并且大多数情况下发生在您的活动处于暂停状态时。 我面临类似的问题,我通过引入一个布尔变量并在 catch 块中将其设置为 true 来解决它。您可以重现此错误,只需在提交片段时添加 10 到 15 秒的后期处理并运行您的活动并在 10 15 秒后将其置于 onpause 状态,当活动处于 onpause 状态时尝试提​​交片段时,您会发现崩溃。

public void replaceFragment(Fragment fragment) {
try {
   FragmentManager fm = getSupportFragmentManager();
   FragmentTransaction ft = fm.beginTransaction();
   ft.replace(R.id.flContent, fragment);
   ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
   ft.commit();
  }catch (Exception e)
            {
                stateSaveFragment = true;
                e.printStackTrace();
            }
 }

并在活动的恢复后方法中替换您的片段并再次将 stateSaveFragment 设置为 false。我是这样解决的,对你有帮助。

@Override
protected void onPostResume() {
    super.onPostResume();
    if(stateSaveFragment){
        replaceFragment(fragmentName);
    }
    stateSaveFragment=false;
}

【讨论】:

  • 感谢您的回答,我也通过使用这种方法摆脱了这个错误。竖起大拇指!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2021-12-28
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多