Android-Programmierung ViewModel
Willemers Informatik-Ecke

Ein ViewModel kann Daten für eine oder mehrere Activitys oder Fragmente halten. Die Daten des ViewModels bleiben für die Lebensdauer der Activity bzw. des Fragments erhalten. Auch der onCreate der Activity beim Drehen des Smartphones, das beispielsweise beim Drehen des Smartphones eintritt, zerstört die Daten im ViewModel nicht. Entsprechend ist die Datensicherung bei onPause und das Wiederholen bei onResume unnötig.

Zweck des Ganzen ist, dass Daten und View entkoppelt werden. Es geht in erster Linie um die Daten der Oberfläche.

Anlegen eines ViewModels

Die Datenstruktur sollte nicht in der Activity oder im Fragment ausgebreitet werden, sondern in eine eigene Klasse gelegt werden. Die Oberfläche arbeitet über ein Objekt dieser Klasse mit seinen Daten.

Um Daten als ViewModel zu definieren, wird die Klasse ViewModel oder MutableViewModel erweitert.

public class MeinViewModel extends ViewModel {

    // Enhält Daten und Methoden zum Auslesen der Daten
    private int data = 5;

    public void setData(int para) {
        data = para;
    }

    public int getData() {
        return data;
    }
}
Ein Fragment oder eine Activity speichert Daten. Dazu legt es ein Objekt der Klasse ViewModelProvider an. Als Parameter wird die Activity oder das Fragment angegeben, an deren Lebenszyklus sich das ViewModel hält. Das Leben des ViewModels hängt also an dem Leben von Fragment beziehungsweise Activity.
public class MeinFragment extends Fragment {
    private MeinViewModel model;
    int daten = 42;

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        model = new ViewModelProvider(getActivity()).get(MeinViewModel.class);
        model.setData(daten);
    }
}
Der Aufruf von getActivity liefert die Activity, die das Fragment steuert. Damit ist der ViewModelProvider bestimmbar. Der folgende get holt das Objekt der angegebenen ViewModel-Klasse. Über dieses Objekt lassen sich nun alle Elemente der MeinViewModel zugreifen. In diesem Fall werden mit setData die hier gewonnen Daten gesichert.

Ein anderes Fragment kann die Daten wieder auslesen. Die Vorarbeiten sind gleich. Es wird dieses Mal getData aufgerufen.

public class DetailFragment extends Fragment {
    int daten = 0;

    public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        MeinViewModel model = new ViewModelProvider(getActivity()).get(MeinViewModel.class);
        daten = model.getData();
        });
    }
}