2015-12-29 7 views
5

Я пытаюсь заменить fragment в onActivityResult(), но она всегда дает мне ошибку java.lang.illegalStateException.onActivityResult() ошибка фрагмент транзакции

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 код

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

} 
+0

попробовать transaction.commitAllowingStateLoss(); –

+0

Я пробовал, что он не заменяет фрагмент, вместо этого показывает пустой фрагмент в этом месте –

+0

вы можете проверить [это] (http://stackoverflow.com/questions/14177781/java-lang-illegalstateexception-can-not-perform -this-action-after-onsaveinstanc), [this] (http://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-wit), [это] (http : //stackoverflow.com/questions/7469082/getting-exception-illegalstateexception-can-not-perform-this-action-after-onsa) – pRaNaY

ответ

8

Наконец нашел решение, фрагмент не может быть заменен или заменен на onActivityResult()

Нам нужно поместить этот код в Handler или в OnResume()

Solution:

private boolean change_fragment=false; 

OnActivityResult() Код

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

    change_fragment=true; 
} 

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

Примечание для читателей: вы не должны совершать транзакции фрагмента в onResume(). Используйте метод onResumeFragments() (для FragmentActivity) или onPostResume() (для активности), который позволит избежать ошибки «java.lang.IllegalStateException: не удается выполнить это действие после проблемы onSaveInstanceState». Кредиты на http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html – vanomart

+0

ничего не работает в моем случае ни обработчик, ни onresume :-( –

0

Have вы попробовал это? надеюсь, что это помогает

Вам необходимо получить fragment manager от вашего основных деятельности.

Попробуйте ниже фрагменте кода: -

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

Ответ на этот вопрос в том, что вы не должны вызывать совершить на транзакции фрагмент, прежде чем ему нагрузок деятельности это savedInstanceState или после того, как он спасает его savedInstanceState.

В одном из существующих ответов на этот вопрос упоминается Activity # onResume() как место для фиксации транзакции фрагмента, но Activity # onPostResume() будет лучшим вариантом, поскольку он вызывается, когда состояние экземпляра операции гарантировано для восстановления.

Хорошее объяснение того, что происходит и почему это происходит, при условии, в этом блоге: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html

Смежные вопросы