So erhalten Sie die Ansicht eines Fragments außerhalb von OnCreateView ()

8

Ich habe ein Fragment mit einem TableLayout . Die Daten in der Tabelle stammen aus einer SQLite-Datenbank. Die SQLite-Datenbank wird von einem RESTful-Webservice in AsyncTask in MainActivity aufgefüllt. Der Fragment muss warten, bis die Aufgabe abgeschlossen ist, bevor die Tabelle aufgefüllt wird. Die Fragment wartet auf die aufzurufende Methode onPostExecute() . Wenn dies der Fall ist, wird die Methode onLoadAndStoreComplete() in Fragment aufgerufen. Das alles funktioniert.

Ich muss eine TableLayout außerhalb der OnCreateView() -Methode eines Fragments sehen. Wenn ich die Ansicht des Fragments in onLoadAndStoreComplete bekommen könnte, würde mich das dorthin bringen.

Derselbe Code wie hier. Ich habe mContext von der MainActivity, aber das hat keine getView() Methode zugeordnet.

Ich habe es versucht:
- Erstellen eines Klassenmitglieds rootView und Zuweisen in onCreateView (), aber in onLoadAndStoreComplete() ist es null.
- ein Klassenmitglied tableLayout erstellen und in onCreateView () zuweisen, aber in onLoadAndStoreComplete() ist es null.
- Aufruf von this.getView () erneut in onLoadAndStoreComplete() , aber es gibt null zurück.
- den Inflator in onLoadAndStoreComplete() aufrufen, was funktioniert, aber dann weiß ich nicht, was ich für den Container im .inflate() -Aufruf verwenden soll

Ich verstehe nicht, warum die Klassenmemberwerte von rootView und tableLayout in onLoadAndStoreComplete()

null sind %Vor%     
Al Lelopath 13.04.2015, 14:28
quelle

6 Antworten

6

Wenn ich Ihren Code richtig verstanden habe, stimmt etwas nicht mit Ihrem -Code, der den Fragment-Lebenszyklus nicht beachtet oder einem anderen Fragment-Instanz-Fehler .

A. Lebenszyklusproblem

Das Android-Framework erwartet von Ihrem Fragment, dass es seine Ansicht in der Methode onCreateView() erstellt. View wird verfügbar , nachdem framework diese Methode aufgerufen hat.

Es ist möglich, dass Ihr Code onLoadAndStoreComplete() vor onCreateView() heißt, und dies hat das Problem verursacht.

Sie müssen die Methode zum Auffüllen der tatsächlichen Ansichten mit Daten extrahieren, da sie 2 Einstiegspunkte haben kann. Bitte beachten Sie den folgenden Code:

%Vor%

B. Unterschiedlicher Instanzenfehler

Dies kann auftreten, wenn Sie mit zwei verschiedenen Instanzen des zuvor erwähnten Fragments arbeiten.

Zuerst wird alles in der Reihenfolge aussehen: onCreateView() vor onLoadAndStoreComplete() aufgerufen. Überprüfen Sie deshalb diese:

  • Protokoll / Debug-Standardkonstruktor ruft nach Ihrem Fragment auf. Sie erwarten während des Erstellungs- / Ladeflusses einen Aufruf für Ihr Fragment.
  • Überprüfen Sie, ob das Objekt onCreateView() genau dasselbe Objekt ist, das onLoadAndStoreComplete() aufgerufen hat, Sie können System.identityHashCode(this) verwenden, und verschiedene Werte innerhalb dieser beiden Methoden erhalten ein schlechtes Zeichen

Wenn das passiert, ist die Ursache wahrscheinlich etwas tiefer verborgen, und ohne Code kann ich Ihnen dazu keinen genauen Rat geben. Wie erstellst du dein Fragment? Via XML oder manuell dann über FragmentManager oder über ViewPager?

    
jskierbi 22.04.2015, 09:17
quelle
5

getView() gibt rootView of Fragment aus, das von onCreatedView() zurückgegeben wird. Also, wenn onLoadAndStoreComplete() aufgerufen wird, bevor onCreatedView() beendet ist (was die rootView nicht zurückgeben kann), erhalten Sie null , da noch keine View erstellt wurde.

Ich habe versucht, getView() in onViewCreated() aufzurufen, was NICHT null ist:

%Vor%     
Jemshit Iskenderov 16.04.2015 06:43
quelle
2

Wenn die Felder rootView und tableLayout nach dem Aufruf von onCreateView(..) aus Ihrem Codefragment initialisiert werden und beide Felder danach nicht auf null gesetzt werden, dürfen sie nicht null sein, wenn Sie onLoadAndStoreComplete(..) aufrufen.

Ich sage, dass Sie diese Methode in einer anderen Instanz Ihres Fragments aufrufen. Überprüfen Sie Ihren Aktivitätscode und prüfen Sie, ob Sie immer dieselbe Instanz aus dem Fragment verwenden.

    
juanhl 21.04.2015 11:18
quelle
1
  

Ich brauche eine Ansicht eines TableLayout außerhalb der OnCreateView ()   Methode eines Fragments. Wenn ich die Ansicht des Fragments sehen könnte   onLoadAndStoreComplete das mich dorthin bringen würde.

Versuchen Sie, die Definition von onLoadAndStoreComplete zu ändern, um eine Ansicht zu erstellen und dann eine Ansicht des Fragments zu übergeben.

    
Joshua Byer 16.04.2015 21:46
quelle
1

Sind Sie sicher, dass onLoadAndStoreComplete () nach onCreateView () aufgerufen wird? Der einzige Grund dafür, dass Instanzvariablen null sind, ist, dass die Methode, die sie initialisiert, nicht aufgerufen wird.

Ich empfehle Ihnen, Log.d in onAttach, onDetach, onCreate, onCreateView, onStart, onStop, onLoadAndStoreComplete aufzurufen, um zu sehen, in welcher Reihenfolge sie aufgerufen werden. Danach aktualisieren Sie Ihre Frage mit der Protokollausgabe, um zu sehen, welches das Problem sein könnte, und wahrscheinlich könnte ich Ihnen eine prägnantere Antwort geben.

    
Adrian 19.04.2015 03:10
quelle
1

Sie können mehrere Korrekturen vornehmen:

Wenn die asynchrone Task vor dem Start des Fragments aufgerufen wird, kann Ihr Callback onLoadAndStoreComplete vor der onCreateView aufgerufen werden (und alle Ihre Views sind nicht aufgebläht)

Sie können die asyncTask von onCreateView ausführen, aber Sie müssen ein Ladeprogramm anzeigen, um dem Benutzer mitzuteilen, dass die Anwendung synchronisiert wird

Sie können auch eine Listenansicht und kein Tabellenlayout verwenden:

%Vor%

Sie müssen Ihr tableLayout zu einer ListView (in RelativeLayout?) ändern

    
Apollo 21.04.2015 13:27
quelle

Tags und Links