RuntimeException:具有MainActivity.onStart的java.lang.IllegalArgumentException [英] RuntimeException: java.lang.IllegalArgumentException with MainActivity.onStart

查看:85
本文介绍了RuntimeException:具有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();
}
}

以下是Google控制台捕获的堆栈跟踪,但搜索后仍未获得解决方案.请让我知道某人是否有更好的解决方案或有相同的问题.

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秒后将其置于onpause状态,当活动处于onpause状态时尝试提​​交片段时,您会发现崩溃.

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;
}

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

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