Android 替换ViewPager中的片段-获取NPE

Android 替换ViewPager中的片段-获取NPE,android,android-viewpager,Android,Android Viewpager,我已经搜索了关于如何替换viewPager中的片段的其他答案,但没有结果 设置是正常的,我有2个片段 [片段1][片段2] 从操作栏我有一个搜索按钮,它在覆盖模式(谷歌搜索)下启动一个新的意图,然后在onActivityResult中,我想用新的片段替换当前片段 我已经完成了SearchFragment,如果我将它作为第三个片段添加到选项卡中,它就会工作。不过,我只想用新的搜索片段替换Fragment2 我有一个很好的适应课程 因此,当我单击actionbar中的Search按钮时,我会在onA

我已经搜索了关于如何替换viewPager中的片段的其他答案,但没有结果

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

[片段1][片段2]

从操作栏我有一个搜索按钮,它在覆盖模式(谷歌搜索)下启动一个新的意图,然后在onActivityResult中,我想用新的片段替换当前片段

我已经完成了SearchFragment,如果我将它作为第三个片段添加到选项卡中,它就会工作。不过,我只想用新的搜索片段替换Fragment2

我有一个很好的适应课程

因此,当我单击actionbar中的Search按钮时,我会在onActivityResult()中触发此代码

但是,应用程序崩溃并出现错误:

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()的值

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


谢谢

我也遇到了同样的问题,如果您在activityresult()中提交一个片段,它将不起作用

但是你可以通过

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);
    }
}
有关片段事务和错误的更多信息,请参阅

添加视图寻呼机和适配器代码,并将完整代码保存在
onactivityResult()
中,使用一些视图或处理程序发布可运行文件,并在该可运行文件中执行该任务。比如:
newhandler().post(newrunnable(){})谢谢,是的,从onResume打来的电话完成了任务。
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);
    }
}