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 Bundledie 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

Schreibe einen Kommentar