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