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()
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:
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?
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:
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.
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.
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.
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
Tags und Links android android-fragments