在ViewPager中替换片段 - 获取NPE

时间:2016-09-14 04:43:56

标签: android android-viewpager

我已经搜索了有关如何在viewPager中替换片段的其他答案,但无济于事。

设置是常见的,我有2个片段。

[片段1] [Fragment2]

在操作栏中,我有一个搜索按钮,以叠加模式(Google搜索)启动新的Intent,然后在onActivityResult中我想用新的片段替换当前的片段。

我已经完成了SearchFragment,如果我在标签中将其添加为第3个片段,它就可以了。但是我只想用新的搜索片段替换Fragment2。

我有一个有帮助的sectionsPagerAdapter类。

因此,当我单击操作栏中的searchButton时,我在onActivityResult()中触发此代码

   SearchFragment searchFragment = new SearchFragment();
   FragmentManager fm = getSupportFragmentManager();
   fm.beginTransaction().replace(R.id.container, searchFragment)
                        .addToBackStack(null)
                        .commit();

然而,该应用程序崩溃并出现错误:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.app/com.example.MainActivityTabs}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

at com.example.MainActivityTabs.onActivityResult(MainActivityTabs.java:168)

168是.commit();

如果我按下按钮时触发片段事务,它至少不会崩溃,但它会清除寻呼机中的两个片段。所以我认为那里有两个问题。

由于

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,如果您在onActivityResult()

中提交片段,它将无效

但你可以通过

实现这一目标
boolean replaceFragment=false;

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
       replaceFragment = true;
}

@Override
public void onResume() {
    super.onResume();
    if (replaceFragment) {
        replaceFragment = false;
        //do your fragment transaction in handler with some time
        new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                   //Do your fragment transaction here
                }
        }, 500);
    }
}

有关片段事务和错误的更多信息,请参阅 https://medium.com/@bherbst/the-many-flavors-of-commit-186608a015b1#.9gnzh4wqi