getSupportLoaderManager () verwendet dieselben IDs in verschiedenen Fragmenten?

8

Ich mache einen viewPager in einer FragmentActivity mit mehreren ListFragments. Um die verschiedenen Listenansichten zu füllen, erhalte ich LoaderManager und initiiliaze im Loader. Ich wollte für jedes Fragment einen eindeutigen LoaderManager haben, aber Fragmente haben keine getSupportLoaderManager () -Methode, daher muss ich die Elternfragmentaktivität aufrufen:

%Vor%

Das Problem bei diesem Ansatz, dass meine Loader-IDs in verschiedenen Fragmenten miteinander in Konflikt stehen. Es kann ein wenig umständlich werden, wenn Sie bereits mehrere Loader-IDs in einem Fragment haben. Gibt es eine Möglichkeit, einen eindeutigen LoaderManager für jedes Fragment zu erhalten, anstatt das übergeordnete Element aufzurufen? Ich möchte im Grunde die gleiche ID auf mehrere Fragmente verwenden können.

Danke

    
danielz 04.11.2012, 08:16
quelle

2 Antworten

7

Es wäre zu lange ein Kommentar, aber ich führe unsere Diskussion innerhalb der Kommentare Ihrer Frage fort.

Sie sollten es andersherum machen: leben Sie mit der Tatsache, dass die IDs lokal für eine Aktivität sind, nicht für ein Fragment.

Ja, es gibt eine schlechte Kopplung zwischen Fragmenten und Aktivitäten. Meistens rufen Rückrufe von Fragmenten das Fragment mit einer Aktivität zusammen (auch wenn eine Schnittstelle nicht so sauber ist) und um Argumente von einer Aktivität an ein Fragment zu übergeben: Sie müssen eine statische Factory-Methode verwenden, um das Fragment zu erstellen und seine Argumente festzulegen über setArgs.

Und Ihre Frage bezieht sich auf ein solches Kopplungsproblem: Loader-IDs in jedem Fragment einer Aktivität sollten sich nicht mit den IDs überschneiden, die von allen anderen Fragmenten verwendet werden. Das ist auch eine Kopplungsbeschränkung, da wir eine Einschränkung für das Fragment haben, das auf der Aktivitätsebene liegt. Sie haben recht, das könnte vielleicht von Android auf der Fragment-Ebene gelöst worden sein, indem man Loader lokal zu Fragmenten eingeführt hat.

Dennoch könnte es elegante Wege geben, dies zu lösen und ein relatives Entkopplungsschema beizubehalten. Zum Beispiel könnten Sie eine Fabrik von IDs erstellen, die "gute" IDs für Loader innerhalb von Fragmenten erzeugen und Überlappungen verhindern würden (id ++ wäre perfekt):

%Vor%

dann innerhalb jedes Fragments, wenn Sie einen Loader benötigen:

%Vor%

Die Factory kann von allen Fragmenten mit einer der drei Strategien geteilt werden:

  • ein Singleton. Jedes Fragment wird über

    auf die IdFactory zugreifen

    IdFactory idFactory = DefaultIdFactory.getInstance ();

  • Erstellen Sie eine einzelne Instanz einer Klasse, die IdFactory implementiert, machen Sie dieser Instanz dieser Klasse ein Datenfeld in Ihrer Anwendungsklasse und geben Sie ihr einen Getter. Jedes Fragment kann mit

    darauf zugreifen

    IdFactory idFactory = ((MeineAnwendung) getActivity (). getApplicationContext ()) .getIdFactory ();

  • Erstellen Sie Ihre Fabriken auf der Aktivitätsebene. Beide Aktivitäten können die IdFactory-Schnittstelle implementieren oder sie können eine innere Klasse bereitstellen, um dies zu tun. Jedes Fragment würde dann über:

    auf die Factory zugreifen

    IdFactory idFactory = getActivity (). getIdFactory (); //oder  IdFactory idFactory = (IdFactory) getActivity ();

Die dritte Option ist die bessere Option, da sie genau Ihrem Bedarf entspricht und den Lebenszyklen der Aktivitäten folgt, so dass Ihre Fabriken Müll gesammelt werden können.

Es gibt andere Optionen, wie RoboGuice oder Dolch oder ein anderes Framework für die Abhängigkeitsinjektion, aber das ist weniger Standard.

    
Snicolas 04.11.2012, 23:58
quelle
14

Ja, Sie können Folgendes verwenden: android.support.v4 .app.Fragment.getLoaderManager ()  um ein eindeutiges für jedes Fragment zu erhalten, was bedeutet, dass Sie Ihre IDs von Null aus starten können.

    
fr1550n 04.03.2013 15:59
quelle