Ich habe ein paar Artikel und Antworten gelesen (einschließlich dies eins ) in Bezug auf veralteten Code, aber ich bin ein wenig verwirrt, wie man (speziell) den veralteten Fragment
-Ereignishandler onInflate
behandelt.
Ich habe meine Implementierung von
ersetzt %Vor%mit
%Vor%Wenn ich meine App auf einem & lt; API23-Maschine wird der Ersatzcode nicht aufgerufen.
Wenn ich den ursprünglichen veralteten Code wiederherstelle (so dass ich jetzt beide Methoden implementiert habe), wird der veraltete Code aufgerufen, die korrekte Funktionalität wird zurückgegeben, aber jetzt wird ein Aufruf an eine veraltete Methode (?) vorgenommen.
Und wenn ich die App auf einem API23-Rechner starte, scheint es, dass BEIDE Versionen des Handlers aufgerufen werden.
Die Frage ist also, was passiert hier? Wenn ich Code schreibe, der sowohl auf API23 als auch auf älteren Versionen laufen soll, muss ich sowohl die veralteten als auch die neuen Methoden implementieren?
Und wenn das der Fall ist, muss ich "veraltet" andere veraltete Methoden ausfindig machen und implementieren? (Und gibt es daher eine Liste dieser veralteten Methoden, für die "Back-Code" verwendet werden soll?)
UPDATE:
Ich habe jetzt von android.app.Fragment
zu android.support.v4.app.Fragment
geändert (dh von nativen Fragmenten zu Support-Fragmenten) und die App funktioniert nun wie erwartet, wobei der Ersetzungs-Handler-Code für alle Versionen läuft und durch den Android läuft Quelle wie erwartet.
Aber die Frage bleibt: WARUM ?
Warum ist die 'native' android.app.Fragment
Implementierung? Rückblickend auf frühere Fragen wurde dieses Thema bereits im September 2015 diskutiert. Also Warum ist es immer noch ein Problem? Und warum sollte es einen Unterschied bei der Implementierung von Support und nativen Fragmenten nach API 11 geben?
Nein, Sie sollten
nicht implementieren %Vor%Wenn eine Methode veraltet ist, können Sie stattdessen (normalerweise) die Ersatzfunktion verwenden. Überprüfen Sie Fragments Definitionen von onInfllate:
%Vor% Wie Sie sehen können, ist onInflate(Context context...)
eine Erweiterung von onInflate(Activity activity...)
und abwärtskompatibel. Wenn Sie super.onInflate(context, attrs, savedInstanceState);
in Ihrer überschriebenen Methode aufrufen, können Sie davon ausgehen, dass sie sowohl mit API23 als auch mit früheren Versionen funktioniert.
Wenn ich meine App auf einem & lt; API23-Maschine, der Ersetzungscode ist nicht genannt.
Das scheint seltsam, ich kann es nicht reproduzieren, mein Log wird mit einem Code wie diesem in einem Nicht-V23-Rechner ausgeführt:
%Vor%Stellen Sie sicher, dass:
android.support.v4.app.Fragment
anstelle von android.app.Fragment
, und Sie verwenden getSupportFragmentManager()
anstelle von getFragmentManager()
. support-v4
und appcompat-v7
sowie compileSdkVersion 23
in Ihrem build.gradle
Und wenn ich die App auf einem API23-Rechner starte, erscheint BEIDE Versionen des Handlers werden aufgerufen.
Dies kann durch den onInflate(Context context...)
-Code erklärt werden, wobei, wenn es von einer Aktivität aufgerufen wird, onInflate(Activity activity...)
BEARBEITEN
Zum Update:
Die native Implementierung von android.app.Fragment
soll nicht abwärtskompatibel sein. Der Code von android.app.Fragment
ist wegen dieser Tatsache im Allgemeinen viel einfacher als der von android.support.v4.app.Fragment
.
Darüber hinaus gibt es einige Funktionen in der nativen Implementierung, die nicht in die Support-Bibliothek eingeführt werden können, weil sie entweder schwer zu entwerfen sind oder weil sie keine Priorität für die Entwickler haben. Z.B. In nativer Implementierung wird im onInFlate () - Quellcode Transition verwendet, um den Eingang oder Ausgang des neuen Fragments zu animieren. Das ist nirgendwo in der Support-Bibliothek zu finden.
Tags und Links android android-fragments