OnActivityResult () fragment transaction error

I am trying to replace fragment with onActivityResult() , but always gives me the error 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) 

Here is my 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(); } 
+5
source share
3 answers

Finally, the solution found, the fragment cannot be replaced or replaced inActivityResult ()

We need to put this code in Handler or in OnResume()

Decision:

 private boolean change_fragment=false; 

OnActivityResult () code

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

OnResume () code

 @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(); } } 
+9
source

The answer to this question is that you should not call the commit transaction fragment before the action loads its saved InstanceState or after saving the saved InstanceState.

One existing answer to this question mentions Activity # onResume () as a place to commit the fragment transaction, but Activity # onPostResume () would be a better option, as it is called when the state of the activity instance is guaranteed to be restored.

A good explanation of what is happening and why it is happening is provided in this blog post: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

+1
source

Have you tried this? hope this helps

You need to get the fragment manager from the main activity.

Try below snippet: -

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

Source: https://habr.com/ru/post/1239428/


All Articles