Manchmal muss der Benutzer eine Eingabeaufforderung anzeigen, wenn die erforderlichen Daten fehlen. Zum Beispiel eine leere Liste, ein Serverfehler oder keine Internetverbindung. Was ist zu tun, wenn der Hinweis für jeden Fall komplex und unterschiedlich sein sollte? Die folgende Implementierung sollte diese Probleme beheben.
Unter dem Strich wird die Pflicht zur Anzeige von Zusatzinformationen einem separaten Objekt zugewiesen. Dies führt zu einer korrekteren Trennung von Logik und weniger Code in der Aktivität. Fahren wir mit einer detaillierteren Beschreibung der Implementierung fort.
Jeder Hinweis ist ein separates Fragment, das alles enthalten kann. Um sie zu verwalten, benötigt das Objekt einen FragmentManager und die ID des Containers, in dem sich die Fragmente befinden sollen. Es gibt keine Abhängigkeiten mehr.
Jede Situation ist ein Aufzählungselement (mit dem Code wird alles sehr klar), das in diesem Objekt verschachtelt ist. Wenn ein Hinweis geändert werden muss, wird die für das Ersetzen verantwortliche Methode aufgerufen, an die die neue Situation übergeben wird. Das ist alles Logik.
Dies muss nun in der Realität von Android geschehen. Mit Ausnahme der Aktivität (oder des Fragments) selbst, die ein Objekt benötigt, wird niemand anderes darauf verweisen. Es gibt einen anfänglichen "Standard" -Zustand. Es wird beim ersten Erscheinen angezeigt, bis ein neuer Wert angezeigt wird. Die Werte selbst werden in LiveData (im ViewModel) gespeichert, das von der Aktivität abonniert und an das Objekt übergeben wird. Auf diese Weise können Sie die Wiederherstellung von Aktivitäten erleben und den Status beibehalten.
Ich habe mich entschieden, HTTP-Statuscodes als Beispiel zu verwenden, aber jeder kann verwendet werden. Zum Beispiel beim Abfragen einer Datenbank mit Filmen mit Bedingungen zu Veröffentlichungsdatum, Regisseur, Schauspielern usw. Es können verschiedene Hinweise gezeigt werden: Es gibt keinen erforderlichen Schauspieler, keinen Film an diesem Datum, dieser Regisseur hat keine solchen Filme usw.
Nuancen
Wenn Sie beispielsweise die Liste der Daten nicht löschen, wird der Hinweis möglicherweise über (oder unter) dieser Liste angezeigt, was hässlich ist. Dazu müssen Sie zuerst die Liste löschen (oder ihre Sichtbarkeit ausblenden, was ist besser?).
Implementierung
CodeSwitcher.
CodeSwitcher. Ich konnte mir keinen passenden Namen vorstellen.
//
public class CodeSwitcher {
//
public enum Code {
DEFAULT,
HTTP_OK,
HTTP_CREATED,
HTTP_BAD_REQUEST,
HTTP_NOT_FOUND,
NO_DATA
}
//
private FragmentManager fragmentManager;
private int fragmentHostId;
public CodeSwitcher(FragmentManager fragmentManager, int fragmentHostId) {
this.fragmentManager = fragmentManager;
this.fragmentHostId = fragmentHostId;
}
//,
public void switchFragments(Code code) {
FragmentTransaction transaction = fragmentManager.beginTransaction();
switch (code) {
case HTTP_OK:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_OK"));
break;
case HTTP_CREATED:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_CREATED"));
break;
case HTTP_BAD_REQUEST:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_BAD_REQUEST"));
break;
case HTTP_NOT_FOUND:
transaction.replace(fragmentHostId, CodeFragment.newInstance("HTTP_NOT_FOUND"));
break;
case NO_DATA:
transaction.replace(fragmentHostId, CodeFragment.newInstance("NO_DATA"));
break;
default:
transaction.replace(fragmentHostId, CodeFragment.newInstance("Default"));
break;
}
transaction.commit();
}
}
// ViewModel
//
public CodeShowActivityViewModel() {
listCode = new MutableLiveData<>();
listCode.setValue(CodeSwitcher.Code.DEFAULT);
}
// , ,
public void httpOk() {
listCode.setValue(CodeSwitcher.Code.HTTP_OK);
clearList();
}
public void httpBadRequest() {
listCode.setValue(CodeSwitcher.Code.HTTP_BAD_REQUEST);
clearList();
}
// ,
private CodeSwitcher switcher;
// onCreate()
switcher = new CodeSwitcher(getSupportFragmentManager(), R.id._);
// LiveData,
codeActVM.getListCode().observe(this, code -> {
switcher.switchFragments(code);
});
GIF (4 MB) mit Beschreibung
Von Anfang an wird ein Standardstatus angezeigt, der speziell im Hintergrund angezeigt wird. In Wirklichkeit sollte er jedoch leer sein. Dann wird der Empfang verschiedener Codes und deren Anzeige emuliert. Am Ende wird gezeigt, dass der Zustand auch dann bestehen bleibt, wenn die Aktivität neu erstellt wird.
Was halten Sie von dieser Methode?
PS
Ärger mit den Namen ...