Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android onActivityResult()片段事务错误_Android_Android Fragments - Fatal编程技术网

Android onActivityResult()片段事务错误

Android onActivityResult()片段事务错误,android,android-fragments,Android,Android Fragments,我试图替换onActivityResult()中的片段,但它总是给我java.lang.illegalStateException的错误。 Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime: at android.support.

我试图替换
onActivityResult()
中的
片段
,但它总是给我
java.lang.illegalStateException的错误。

Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:     at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1377)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:     at     android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1395)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:     at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:637)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:     at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:616)
12-29 18:50:21.455 5554-5554/com.package E/AndroidRuntime:     at .virtualClass.VirtualPurchaseFragment.dealWithSuccessfulPurchase(VirtualPurchaseFragment.java:161)
这是我的
onActivityResult
code

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    Fragment fragment = new VirtualListFragment();
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();

}

终于找到了解决方案,片段无法在onActivityResult()中交换或替换。

我们需要将此代码放入
处理程序
OnResume()

解决方案:

private boolean change_fragment=false;
OnActivityResult()代码

OnResume()代码


首先调用super.onActivityResult应该可以解决这些问题

尝试下面的代码片段:-

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1){
        if(resultCode == Activity.RESULT_OK){
            android.support.v4.app.FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container, new DemoFragment(), "fsdf").commit();
        }
    }
}

这个问题的答案是,在活动加载其savedInstanceState之前或保存其savedInstanceState之后,不应该对片段事务调用commit

这个问题的一个现有答案提到Activity#onResume()是提交片段事务的地方,但是Activity#onpostsresume()是一个更好的选择,因为它是在保证恢复活动的实例状态时调用的


这篇博文很好地解释了正在发生的事情及其原因:

try transaction.commitAllowingStateLoss();我已经试过了,它不是在替换片段,而是在那个地方显示空白片段。你能检查一下吗,@pRaNaY谢谢,我已经检查了所有这些链接,但是
commitAllowingStateLoss
只会停止异常,而不是替换片段你需要使用
getSupportFragmentManager()
而不是
getFragmentManager()
在使用v4片段时。读者注意:不应在onResume()中提交片段事务。使用onResumeFragments()(用于FragmentActivity)或onPostResume()(用于Activity)方法可以避免“java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作”问题。在我的情况下,Credits to nothing无论是handler还是onresume都不起作用:-(这正是我要找的!
@Override
public void onResume() {
    super.onResume();
    if(change_fragment)
    {
        change_fragment=false;
        Fragment fragment = new VirtualListFragment();
        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager.beginTransaction().replace(R.id.frame_container, fragment).commit();
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if(requestCode == 1){
        if(resultCode == Activity.RESULT_OK){
            android.support.v4.app.FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
            android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            fragmentTransaction.replace(R.id.container, new DemoFragment(), "fsdf").commit();
        }
    }
}