2014-10-29 2 views
0

У меня есть регистрационная деятельность, внутри которой у меня есть несколько фрагментов (шаг за шагом потока регистрацию) ..перехода Android-фрагмент происходит после того, как приложение входит фон

В деятельности, у меня есть этот метод updateRegistrationStage(), который обрабатывает фрагментный переход .. вот в чем проблема: 1) Я нажимаю кнопку «Продолжить», отправляю некоторые данные на сервер и ожидаю ответа. 2) Прежде чем получить какой-либо ответ, я нажимаю кнопку «домой», поэтому приложение вводит фон. 3), то я получил ответ и должен был перейти к следующему фрагменту ... в этот момент я звоню:

transaction = fm.beginTransaction(); 
transaction.add(R.id.registration_container, newFragment, newFragment.toString()); 
transaction.commit(); 

И приложение падает .. метание

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

, если я изменю последнюю строку

transaction.commitAllowingStateLoss(); 

Было бы сказать

java.lang.IllegalStateException: Activity has been destroyed 

Я думаю, что это можно установить флаг, например, isActivityAlive, чтобы убедиться, что транзакция зафиксирована, когда активность еще жива ... но .. это довольно уродливо. Есть ли лучший способ отмены транзакции фрагмента, когда активность больше не активна.

ответ

1

Вы должны сохранить состояние регистрации отдельно от пользовательского интерфейса и использовать прослушиватели для интерфейса обновления. использовать обратный вызов активности onStart для обновления состояния и инициализации всех слушателей и onStop для размещения слушателей

UPDATE: я написал простой заглушка для этого решения, но я не пытался скомпилировать. Это, например, только

//UI 
public class RCMActivity extends Activity { 

    RegistrationManager registrationManager = RegistrationManager.getInstance(); 
    OnRegistrationListener listener = new OnRegistrationListener() { 
     public void onComplete(State state) { 
      //change UI here 
     } 
     public void onFailed() {} 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     registrationManager.setListener(listener); 
    } 

    @Override 
    protected void onStop() { 
     super.onStart(); 
     registrationManager.setListener(null); 
    } 
} 

//state in separate file 
public class RegistrationManager { 
    enum State {IDLE, FIRST_STEP, SECOND_STEP, THIRD_STEP}; 
    public interface OnRegistrationListener { 
     void onComplete(State state); 
     void onFailded(); 
    } 

    private OnRegistrationListener listener; 

    private State state = IDLE; 

    public void setOnRegistrationListener(OnRegistrationListener l) 
    { 
     listener = l; 
    } 

    public static RegistrationManager getInstance() {//for example it's singleton} 
} 
+0

вы можете дать мне более подробную информацию? какой должен быть правильный поток/структура .. пример? – xialin

+0

см. Мое обновление выше – Tpec1k

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