Erstellen eines Fragments: Konstruktor vs. newInstance ()
Ich habe vor kurzem wurde es müde, ständig zu wissen String
- Tasten, um Argumente in Bundles
beim erstellen meines Fragments
. So entschied ich mich zu Konstruktoren für meine Fragments
würde, dass die Parameter, die ich wollte, und diese Variablen in die Bundles
mit der richtigen String
Tasten, daher entfällt die Notwendigkeit für andere Fragments
und Activities
kennen zu müssen diese Schlüssel.
public ImageRotatorFragment() {
super();
Log.v(TAG, "ImageRotatorFragment()");
}
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
//Get arguments passed in, if any
Bundle args = getArguments();
if (args == null) {
args = new Bundle();
}
//Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
setArguments(args);
}
Und dann ich ziehen diese Argumente wie normal.
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v(TAG, "onCreate");
//Set incoming parameters
Bundle args = getArguments();
if (args != null) {
mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]);
}
else {
//Default image resource to the first image
mImageResourceId = StaticData.getImageIds()[0];
}
}
Jedoch, Fussel hat Problem mit diesem ist, dass keine Unterklassen von Fragment
mit Konstruktoren mit anderen Parametern, weshalb ich verwenden @SuppressLint("ValidFragment")
sogar die app auszuführen. Die Sache ist die, dieser code funktioniert einwandfrei. Ich kann verwenden ImageRotatorFragment(int imageResourceId)
oder die old-school Methode ImageRotatorFragment()
- und call - setArguments()
manuell auf. Bei Android muss neu das Fragment (Ausrichtung ändern oder niedrigen Arbeitsspeicher), ruft es die ImageRotatorFragment()
Konstruktor auf und übergibt dann das gleiche argument Bundle
mit meinen Werten, die erhalten richtig eingestellt.
So, ich habe die Suche für die "vorgeschlagen" - Ansatz und sehen eine Menge von Beispielen mit newInstance()
zu erstellen Fragments
mit Parametern, die scheint die gleiche Sache, die mein Konstruktor ist. Also machte ich meine eigene, um es zu testen, und es funktioniert genauso einwandfrei wie vorher, abzüglich Lint jammern.
public static ImageRotatorFragment newInstance(int imageResourceId) {
Log.v(TAG, "newInstance(int imageResourceId)");
ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment();
//Get arguments passed in, if any
Bundle args = imageRotatorFragment.getArguments();
if (args == null) {
args = new Bundle();
}
//Add parameters to the argument bundle
args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
imageRotatorFragment.setArguments(args);
return imageRotatorFragment;
}
Ich persönlich finde, dass die Verwendung von Konstruktoren ist viel mehr gängige Praxis als zu wissen, zu verwenden newInstance()
und die übergabe von Parametern. Ich glaube, Sie können dieses gleiche Konstruktor Technik mit Aktivitäten und Fusseln nicht beschweren. Also im Grunde meine Frage ist, warum macht Google nicht möchten, dass Sie verwenden Konstruktoren mit Parameter für Fragments
?
Meine einzige Vermutung ist, so dass Sie nicht versuchen, eine Instanz-variable ohne Verwendung der Bundle
die nicht bekommen, wenn der Fragment
wird neu erstellt. Durch die Verwendung eines static newInstance()
Methode, die der compiler nicht lassen Sie Zugriff auf eine Instanzvariable.
public ImageRotatorFragment(int imageResourceId) {
Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");
mImageResourceId = imageResourceId;
}
Ich noch nicht das Gefühl, wie das ist Grund genug Sie zu verbieten die Verwendung der Parameter in Konstruktoren. Sonst noch jemand Einblick in diese?
InformationsquelleAutor der Frage Steven Byle | 2013-02-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den factory-Methode pattern verwendet wird, die relativ Häufig in der modernen software-Entwicklung.
Sie beantwortet Ihre eigene Frage:
Richtig.
Sind Sie herzlich willkommen, um Ihre Meinung. Sie sind herzlich eingeladen zu deaktivieren, diese Fusseln überprüfen, entweder auf einer pro-Konstruktor oder pro-workspace-Mode.
InformationsquelleAutor der Antwort CommonsWare
Nur Android neu Fragmente kills mit dem default-Konstruktor, so dass die Initialisierung machen wir in zusätzliche Konstruktoren verloren.Somit können Daten verloren gehen.
InformationsquelleAutor der Antwort Jatin Sachdeva