2016-04-19 13 views
7

Was ist der wahre Unterschied zwischen diesen beiden Ansätzen?Fragment newInstance warum Argumente verwenden?

1.Ich Standard alten fashined Bündel bin mit:

public static final Fragment newInstance(int val1, int val2) { 
    TestFragment f = new TestFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putInt("val1", val1); 
    bundle.putInt("val2", val2); 
    f.setArguments(bundle); 
    return f; 
} 

2.I als Beispiel Mitglieder

public static final Fragment newInstance(int val1, int val2) { 
    TestFragment f = new TestFragment(); 
    f.val1 = val1; 
    f.val2 = val2; 
    return f; 
} 

Antwort

6

Im ersten Beispiel setze, habe eigentlich nicht das Fragment gesetzt Instanzvariablen val1 und val2, so dass sie nicht initialisiert bleiben. Aus diesem Grund müssen Sie das Paket in onCreate zurücklesen, um die Instanzvariablen festzulegen.

wenn das Fragment Instanz wird zerstört und neu erstellt (zB durch eine Vorrichtung Rotation), die onCreate (oder onCreateDialog für DialogFragments) unter Verwendung der Argumente erneut geladen werden kann:

public void onCreate(Bundle savedInstanceState) 
{ 
if (savedInstanceState != null) 
{ 
    Bundle args = getArguments(); 
    val1 = args.getInt("val1"); 
    val2 = args.getInt("val2"); 
} 
} 

und Ihr Zustand kann wiederhergestellt werden.

+0

Es ist ziemlich logisch und offensichtlich jetzt, dumm mir! Vielen Dank! – Heisenberg

3

Das arguments Bündel wird in onSaveInstanceState() beibehalten, während Konstruktorparameter nicht sind.

Ähnlich wie das passiert, wenn Sie Ihre Felder nicht auf onSaveInstanceState() in einer Aktivität speichern. Denken Sie an das arguments Bündel wie eine Absicht, Intent s werden auch über Prozess Tod und Konfigurationsänderung beibehalten.

Verwandte Themen