Ich erstelle eine App mit Fragments
und in einer davon habe ich einen nicht standardmäßigen Konstruktor erstellt und die folgende Warnung erhalten:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
Kann mir jemand sagen, warum das keine gute Idee ist?
Können Sie auch vorschlagen, wie ich dies erreichen würde:
public static class MenuFragment extends ListFragment {
public ListView listView1;
Categories category;
//this is my "non-default" constructor
public MenuFragment(Categories category){
this.category = category;
}....
Ohne den nicht standardmäßigen Konstruktor zu verwenden?
android
android-fragments
BlackHatSamurai
quelle
quelle
Antworten:
Erstellen Sie ein Bündelobjekt und fügen Sie Ihre Daten ein (in diesem Beispiel Ihr
Category
Objekt). Seien Sie vorsichtig, Sie können dieses Objekt nicht direkt an das Bundle übergeben, es sei denn, es ist serialisierbar. Ich denke, es ist besser, Ihr Objekt in das Fragment zu bauen und nur eine ID oder etwas anderes in ein Bündel zu packen. Dies ist der Code zum Erstellen und Anhängen eines Bundles:Danach in Ihrem Fragment Zugriffsdaten:
Das ist alles.
quelle
Parcelable
Objekte enthalten. Sie sollten auch kein a übergebenContext
, da auf diese Informationen über diegetActivity()
Methode des Fragments zugegriffen werden kann .Type value = getArguments().getType("key");
?newInstance()
Methode hinzufügen . Zum Beispiel :public static FragmentName newInstance(your variables){}
. Erstellen Sie, wie in der Android-Dokumentation empfohlen, keinen Konstruktor mit Parametern, da der Standardkonstruktor (ohne Parameter) nach dem Neustart Ihres Fragments automatisch aufgerufen wird.Es scheint, als würde keine der Antworten tatsächlich antworten: "Warum Bundle zum Übergeben von Parametern anstelle von nicht standardmäßigen Konstruktoren verwenden?"
Der Grund, warum Sie Parameter durch das Bundle übergeben sollten, liegt darin, dass das System beim Wiederherstellen von a
fragment
(z. B. bei Konfigurationsänderung) Ihre automatisch wiederherstelltbundle
.Die Rückrufe mögen
onCreate
oderonCreateView
sollten die Parameter aus dem lesenbundle
- auf diese Weise wird garantiert, dass der Zustand desfragment
korrekt in den Zustand zurückgesetzt wird, mit dem erfragment
initialisiert wurde (beachten Sie, dass dieser Zustand von dem Zustand abweichen kannonSaveInstanceState bundle
, der an übergeben wirdonCreate/onCreateView
).Die Empfehlung, die statische
newInstance()
Methode zu verwenden, ist nur eine Empfehlung. Sie können einen nicht standardmäßigen Konstruktor verwenden, stellen Sie jedoch sicher, dass Sie die Initialisierungsparameter imbundle
Inneren des Konstruktors ausfüllen. Und lesen Sie diese Parameter in den MethodenonCreate()
oderonCreateView()
.quelle
Sie
Fragment
sollten keine Konstruktoren haben, da dieseFragmentManager
instanziiert werden. Sie sollten einenewInstance()
statische Methode mit den benötigten Parametern definieren, diese dann bündeln und als Argumente des Fragments festlegen, auf die Sie später mit demBundle
Parameter zugreifen können .Beispielsweise:
Und lesen Sie diese Argumente unter
onCreate
:Auf diese Weise kann der Objektstatus, wenn er getrennt und erneut angehängt wird, über die Argumente gespeichert werden, ähnlich wie
bundles
beiIntent
s.quelle
Wenn Sie Parameter für eine Klasse verwenden. Versuche dies
quelle
FragmentManager
, verlieren Sie mSomeInstance.Ich denke, es gibt keinen Unterschied zwischen dem statischen Konstruktor und zwei Konstruktoren (leerer und parametrisierter Konstruktor, der Argumente im Argumentbündel eines Fragments speichert). Diese Faustregel wurde höchstwahrscheinlich erstellt, um die Wahrscheinlichkeit zu verringern, dass vergessen wird, den Konstruktor ohne Argumente in Java zu implementieren , die nicht implizit generiert wird, wenn eine Überlastung vorliegt.
In meinen Projekten verwende ich Kotlin und implementiere Fragmente mit einem primären Konstruktor ohne Argumente und einem sekundären Konstruktor für Argumente, die sie nur in einem Bündel speichern und als Fragmentargumente festlegen. Alles funktioniert einwandfrei.
quelle
Wenn das Fragment nach der Konfigurationsänderung nicht standardmäßige Konstruktoren verwendet, verliert das Fragment alle Daten.
quelle