2012-07-09 11 views
38

Hi Ich habe mir das folgende Fragment-Beispiel auf der Android-Seite angeschaut.Was ist der Sinn von setArguments?

http://developer.android.com/guide/components/fragments.html#Example

Ich möchte wissen, warum bestimmte Methoden durchgeführt werden.

Warum zum Beispiel in der detailsFragment ist das folgende Verfahren durchgeführt:

public static DetailsFragment newInstance(int index) { 
    DetailsFragment f = new DetailsFragment(); 

    // Supply index input as an argument. 
    Bundle args = new Bundle(); 
    args.putInt("index", index); 
    f.setArguments(args); 

    return f; 
} 

konnte man einfach nicht auch die DetailsFragment instanziiert und eine Setter-Methode verwenden index statt einzustellen. Umgehen Sie das ganze setArguments.

Was ist der Sinn der Verwendung von setArguments an erster Stelle? Könnten Sie nicht nur Setter und Getter verwenden?

+3

Kürzlich ist es üblich geworden, dass die Kernfunktionalität einer Anwendung in 'Fragments' eingekapselt wird und dann' Activities' im Wesentlichen die Anordnung von (und die Navigation zwischen) Bildschirmen verwaltet, die aus diesen Fragmenten zusammengesetzt sind. Mit einer "Aktivität" könntest du ein "Bündel" von Extras in einer Absicht weitergeben und hast direkt darauf Zugriff, beginnend mit 'onCreate()'. 'Fragmente' reagieren nicht auf Absichten, stattdessen können Sie' setArguments() 'verwenden, um ein" Bündel "von Extras zu erstellen, bevor es erstellt wird. – Karakuri

+0

@Karakuri danke das ist nützlich zu wissen. – HGPB

+1

Werfen Sie einen Blick auf diese: http://Stackoverflow.com/a/7160253/334493 –

Antwort

36

Sie können Getter und Setter verwenden, aber wenn Sie ein Bündel übergeben, müssen Sie diesen Code nicht schreiben, da er bereits vorhanden ist. Außerdem glaube ich, dass diese Argumente automatisch wieder übernommen werden, wenn sich die Bildschirmausrichtung ändert, was auch das Leben erleichtert.

Wesentlichen setArguments und getArguments ist nur ein Design-Muster, dass Google schlägt vor, Sie wie folgt vor:

Jedes Fragment muss einen leeren Konstruktor haben, so ist es instanziiert sein kann, wenn seine Aktivität des Staates wiederherzustellen. Es ist stark empfohlen, dass Unterklassen keine anderen Konstruktoren mit Parametern haben, da diese Konstruktoren nicht aufgerufen werden, wenn das Fragment erneut instanziiert wird; Stattdessen können Argumente vom Aufrufer mit setArguments (Bundle) bereitgestellt und später vom Fragment mit getArguments() abgerufen werden. http://developer.android.com/reference/android/app/Fragment.html

Ich nehme die Setter einschließen, die für Ihr Fragment als auch für den Betrieb benötigt werden. Andererseits - es gibt nichts, was Sie dazu zwingt, und wie Sie wissen - es ist nicht der einzige Weg, um Dinge zum Laufen zu bringen.

+0

Gute Sachen, nur zwei verschiedene Möglichkeiten, um den gleichen Job zu machen - gut. Der zweite Punkt macht die Verwendung von setArguments wertvoll, wenn nur Setter und Getter verwendet werden, wenn dies der Fall ist. In diesem Fall bin ich mir nicht sicher, ob es einen Unterschied machen würde. Aber ich könnte falsch liegen. – HGPB

+0

Wie wäre es mit zwei Konstruktoren; eine leere und eine, die den Anfangszustand des Fragments akzeptiert. Ein Fragment kann dann das in onSaveInstanceState() und onCreate() übergebene Paket verwenden, um den Instanzenstatus beizubehalten? –

+0

Glenn, normalerweise habe ich eine statische Methode getInstance (..), die ein Bündel mit allen Argumenten erstellt und setArguments() für eine neue Instanz des Fragments verwendet. Auf diese Weise haben Sie einen einfachen "Konstruktor" zum Aufruf, die Argumente werden gesetzt, und Android hat einen schönen leeren Konstruktor, den er intern verwenden kann. –

23

Nur um Matthews Antwort hinzuzufügen: Er hat richtig zitiert, dass Fragmente einen leeren Konstruktor haben müssen, damit das Framework sie bei Bedarf neu instanziieren kann.

Es ist in Ordnung, Getter und Setter zu verwenden, aber da das Framework das Fragment zerstören und neu erstellen kann, müssen Sie sicherstellen, dass diese Parameter nicht verloren gehen.

Dies muss über Fragment.onSaveInstanceState() erfolgen. Die gespeicherten Angaben werden Ihnen als Parameter savedInstanceState in Fragment.onCreate(), Fragment.onCreateView() und einigen anderen Methoden zurückgegeben.

Mit Fragment.setArguments() ist (in den meisten Fällen, nehme ich an) einfacher, am Framework wird automatisch die Argumente erhalten und damit wird die meiste Arbeit für Sie tun.

Setter können der Weg sein, Parameter zu wählen, die Sie anfänglich an das Fragment liefern und die sich das Fragment im Laufe der Zeit anpassen kann. Der Umgang mit savedInstanceState alleine kann in diesem Fall einfacher sein als der Umgang mit savedInstanceState und Argumenten - wo Sie eine Entscheidung treffen müssen, welche der gültige Parameter ist.

+4

Dies ist ein kritisch wichtiger Aspekt des Verständnisses von Fragmenten, die meiner Meinung nach grotesk unterbelegt sein können. Ihre Antwort bietet einige Einblicke. Wenn Sie setArguments nicht verwenden möchten und stattdessen einen Setter verwenden möchten, MÜSSEN Sie onSaveInstanceState verwenden oder kann android Ihr Fragment nicht neu initialisieren? Meine Güte! – rmirabelle

+3

@rmirabelle Underdocumentation scheint mir für viele Fälle in Android leider der Fall zu sein. Ich habe viele Fälle entdeckt, die nicht möglich oder problematisch sind und die entweder gar nicht oder nur als Seitenknoten irgendwo oder stackoverflow/google groups irgendwo beantwortet werden. – sstn

5
public void setArguments (Bundle args) 

Versorgung, um die Konstruktion Argumente für dieses Fragment. Dies kann nur aufgerufen werden, bevor das Fragment an seine Aktivität angehängt wurde; das heißt, sollten Sie es sofort nach dem Erstellen des Fragments aufrufen. Die hier angegebenen Argumente werden über Fragment beibehalten zerstören und Schöpfung(kann der Text sein fett gedruckt wurde von offiziellen Dokumentation fehlt bisher) kann

Fragments.setArguments(Bundle args)

+0

Danke. Sie haben diesen kritischen Punkt durch Bereitstellung der relevanten Dokumentation bestätigt. – stevehs17

0

Zusätzlich Setter missbraucht werden . Wenn updateSomeOtherStuff() einige Ansichten ändert, stürzt dies ab.

public class MyFragment extends Fragment { 
    void setData(someData){ 
     this.someData = someData; 
     updateSomeOtherStuff() 
    } 
} 

Wenn eines davon in einem Bündel es nicht möglich ist, die Setter zu mißbrauchen und Sie werden immer wissen, dass dies innerhalb der Lifecycle-Methoden festgelegt werden.