2016-11-21 4 views
1

Так что я делаю это дело после того, как пользователь возвращается к моей деятельности от службы оплаты:Начало: java.lang.IllegalStateException: Не удается выполнить это действие после onSaveInstanceState при попытке показать DialogFragment

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Bundle metadata = getMetadata(); 

    if (metadata == null || requestCode != metadata.getInt(REQ_CODE)) { 
     return; 
    } 

    if (resultCode == RESULT_OK) { 
     EventBus.getDefault().post(new PaymentResult(data, true)); 
    } else { 
     EventBus.getDefault().post(new PaymentResult(data, false)); 
    } 
} 

в методе подписываться на PaymentResult я выводя фрагмент (или, вернее, - я пытаюсь показать диалоговый фрагмент):

@Subscribe(threadMode = ThreadMode.MAIN) 
public void onPaymentResult(PaymentResult result) { 
    String message; 

    if (result.getStatus()) { 
     message = "ok"; 
    } else { 
     message = "baaaad"; 
    } 

    DialogFragment newFragment = NotificationFragment.newInstance(message); 
    newFragment.show(((AppCompatActivity)mContext).getSupportFragmentManager(), "notification"); 
} 

Но я удар это исключения. Как преодолеть это?

ответ

1

вам нужно использовать commitAllowingStateLoss(), чтобы избежать этого исключения

показать фрагмент этого

FragmentManager fm = ((AppCompatActivity)mContext).getSupportFragmentManager(); 
    NotificationFragment newFragment = NotificationFragment.newInstance(message); 

    fm.beginTransaction() 
       .add(newFragment, "notification") 
       .commitAllowingStateLoss(); 

    fm.executePendingTransactions(); 

при добавлении DialogFragment без контейнера ID, то показано как Диалог иначе он будет показан как обычный фрагмент, если указан контейнер id.

executePendingTransactions() есть для транзакции синхронного фрагмента, которая является необязательной.

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