MVVM & Vincolante e Contesto

0

Domanda

Il mio collega e ho avuto una discussione. Siamo a tradurre l'applicazione di MVVM+Associazione. C'era la necessità di avviare una finestra di dialogo da un frammento. Io lo faccio così:

Nel frammento:

fragmentBinding.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
       // there's a bunch of code here 
     alertDialog.show();
}});

Un collega sostiene anche che hai bisogno di fare questo:

Nel file xml possiamo scrivere come segue:

android:onClick="@{v -> viewModel.showDialog(context)}"

E nel ViewModel:

fun showDialog(context: Context){
     AlertDialog.Builder builder = new AlertDialog.Builder(context);
       // there's a bunch of code here
     alertDialog.show();
}

Per favore, dimmi, quale è corretta?

android binding mvvm
2021-11-21 22:26:10
1

Migliore risposta

2

ViewModel è responsabile della preparazione dei dati per l'interfaccia utente, come accennato in Android Developer Guide.

Quindi una pratica migliore è di non trattare con gli elementi dell'interfaccia utente nel ViewModel. Anche se i codici di eseguire comunque se passiamo il Context per il ViewModel e permettono di mostrare un' alertDialogsi può anche bisogno di essere a conoscenza che l'attività/il frammento e il ViewModel hanno cicli di vita differenti, quindi è necessario essere attenti quando si passa il Context per il ViewModel

Più sensibili modo per gestire questo, sarebbe per il ViewModel per mantenere una bandiera e di preparare il messaggio desiderato utilizzando LiveData o qualcosa di simile, in modo che l'attività / il frammento osserva che e effettivamente costruire e mostrare un AlertDialog da sempre il messaggio dal ViewModel, e notificare il ViewModel quando la finestra di dialogo è stato mostrato/cliccato, in modo che il ViewModel gestirà la conseguente logica di business.

Per il tuo caso particolare, mi sento di lasciare l' AlertDialog codice attività/frammento, mentre, se necessario, verranno recuperare i dati dal ViewModel.

2021-11-21 22:45:45

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................