2015-05-19 13 views
12

Ho qualche dubbio riguardo allo stato di salvataggio tramite MVP su Android. Ho definito i miei frammenti/attività come viste e poi ho implementato i relatori corrispondenti.MVP Android - Dove si salva lo stato di visualizzazione?

Il mio esempio è semplice:

ho un'attività con alcune caselle di controllo e filatori. Se l'attività viene distrutta dal sistema Android e quindi ricreata, dove devo salvare questi spinners e gli stati delle caselle di controllo? Alla vista? Sul presentatore?

Se nella vista, dovrei avere la logica di ripristino sulla vista o sul presentatore?

Grazie!

risposta

2

Nel caso di MVP, è il il modello che si occupa di mantenere lo stato della vista.

Per esempio, in te modello che hanno un Messaggio entità con una serie di categorie . Nella tua vista hai una casella di controllo per ogni categoria e in ogni azione selezionata/deselezionata aggiungi/rimuovi oggetti dall'array Categoria Categoria Post.

Una volta che l'attività viene ripristinata, il vista dovrebbe chiedereCategoria gamma della del post al fine di scoprire quali sono selezionati e che non sono, in modo che possa impostare il corretto controllato attributo/incontrollato.

Ecco davvero un buon post su di esso: http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/

+0

Capisco, ma il mio esempio è una forma di creazione. Quindi il mio modello potrebbe essere un post con le categorie. Il problema è che non salverò mai l'oggetto post. L'obiettivo è creare un oggetto post e usarlo per fare una richiesta web. Quindi, immagino che l'unico modo per farlo sia archiviare nella vista e quindi ricreare lo stato della vista. Ho sbagliato? @mmark –

+1

@ FábioCarballo se non frainteso l'obiettivo di MVP, non sarà necessario salvare l'oggetto Post (con "salva" presumo si intenda qualcosa come un db locale o SharedPreferences). Il presentatore + il modello è colui che dovrebbe persistere (in memoria) attraverso le modifiche dello stato della vista – mmark

0

Il presentatore è un'interfaccia tra il modello e la vista e non deve prendere alcuna responsabilità per il salvataggio di qualsiasi stato. Ha più senso lasciare il modello o lo stato di visualizzazione Visualizza:

  1. Modello. Presenter è responsabile per il popolamento dei dati Visualizza con modello durante l'inizializzazione dell'attività e conferma all Visualizza immediatamente le interazioni con il modello. Il modello è sempre aggiornato, quindi i cambiamenti di configurazione sono irrilevanti.
  2. Visualizza. Presenter è responsabile per il popolamento dei dati Visualizza con modello durante l'inizializzazione, tuttavia la vista salva e ripristina il proprio stato attraverso le modifiche di configurazione. Ciò ha senso in una situazione di creazione/modifica in cui esiste un pulsante "Salva" e si dispone di un modello transitorio (o modello di lavoro).

Quest'ultimo approccio ha senso quando esiste un pulsante "Salva". Il presentatore non è coinvolto in alcun modo.

0

1. Salva & Ripristina stato vista in Visualizza (attività/frammento).

io preferisco salvare & ripristinare lo stato di visualizzazione in vista per sé (Attività/frammento)

Quindi la responsabilità di vista per salvare il suo stato (qui aderire al principio di responsabilità singola).

Esempio

/** 
* On Save Instance State. 
* 
* @param outState Out State. 
*/ 
@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putString(STATE_KEY_USERNAME, getUserNameFieldValue()); 
    outState.putString(STATE_KEY_PASSWORD, getPasswordFieldValue()); 
    outState.putBoolean(STATE_KEY_REMEMBER_ME, getRememberMeFieldValue()); 
} 

/** 
* On Restore Instance State. 
* 
* @param savedInstanceState Saved Instance State. 
*/ 
@Override 
protected void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    if (savedInstanceState != null) { 
     String userName = savedInstanceState.getString(STATE_KEY_USERNAME, ""); 
     String password = savedInstanceState.getString(STATE_KEY_PASSWORD, ""); 
     boolean rememberMe = savedInstanceState.getBoolean(STATE_KEY_REMEMBER_ME, false); 

     userNameEditText.setText(userName); 
     passwordEditText.setText(password); 
     rememberMeCheckBox.setChecked(rememberMe); 
    } 
} 

2. Salva & Restore Presentatore Stato Presentatore

Se è necessario salvare ogni stato del presentatore poi farlo in presentatore.

mio presentatore Base sarà presente

/** 
* On Create View. 
* <p> 
* 1. Gets called from view's onCreate method. 
* 
* @param view   View. 
* @param savedInstanceState Saved Instance State. 
*/ 
void onCreateView(final View view, final Bundle savedInstanceState); 

/** 
* On Attach View. 
* <p> 
* 1. Gets called from view's onStart method. 
*/ 
void onAttachView(); 

/** 
* On Detach View. 
* <p> 
* 1. Gets called from view's onStop method. 
*/ 
void onDetachView(); 

/** 
* On Save State. 
* <p> 
* 1. Gets called before view is destroyed to save the state of the presenter. 
* 
* @param outState Bundle in which to place your saved state. 
*/ 
void onSaveState(final Bundle outState); 

/** 
* On Destroy View. 
* <p> 
* 1. Gets called from view's onDestroy method. 
*/ 
void onDestroyView(); 
Problemi correlati