运行时异常:带有 MainActivity.onStart 的 java.lang.IllegalArgumentException [英] RuntimeException: java.lang.IllegalArgumentException with MainActivity.onStart

查看:28
本文介绍了运行时异常:带有 MainActivity.onStart 的 java.lang.IllegalArgumentException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

切换片段时可能与

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,搜索后还是没有得到解决方案.如果有人有更好的解决方案或有同样的问题,请告诉我.

The below is the stacktrace caught by Google console, and still didn't get the solution after searching. Please let me know if someone has better solution or have the same problem.

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)

将不胜感激

推荐答案

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

Basically when you replace fragment it loss its state this is very know bug in Android os and mostly it happen when your activity is in onpause state. I face similar kind issue and I solve it like this by introducing a bollean variable and set it true in catch block. You can reproduce this bug just add post dealy of 10 to 15 sec while commit the fragment and run your activity and put it in onpause state after 10 15 sec you can find crash when it try to commit fragment when activity is in onpause state.

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.我是这样解决的,我帮你.

And in post resume method of activity replace your fragment and set stateSaveFragment to false again. I solve it like this my it help you.

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

这篇关于运行时异常:带有 MainActivity.onStart 的 java.lang.IllegalArgumentException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆