Ich versuche, eine ImageView in einem Fragment zu erstellen, die auf das ImageView-Element verweist, das ich im XML für das Fragment erstellt habe. Die findViewById
Methode funktioniert jedoch nur, wenn ich eine Aktivitätsklasse erweitere. Gibt es sowieso welche, die ich auch in Fragment verwenden kann?
public class TestClass extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ImageView imageView = (ImageView)findViewById(R.id.my_image);
return inflater.inflate(R.layout.testclassfragment, container, false);
}
}
Die findViewById
Methode weist einen Fehler auf, der besagt, dass die Methode undefiniert ist.
android
android-fragments
android-imageview
findviewbyid
vereinfacht.
quelle
quelle
Antworten:
Verwenden Sie getView () oder den View-Parameter, um die
onViewCreated
Methode zu implementieren . Es gibt die Stammansicht für das Fragment zurück (die von deronCreateView()
Methode zurückgegebene) . Damit können Sie anrufenfindViewById()
.Da dies
getView()
erst danach funktioniertonCreateView()
, können Sie es nicht innerhalbonCreate()
oder inonCreateView()
Methoden des Fragments verwenden.quelle
ImageView
vom aufgeblasenen Layout kommt - siehe meine Antwort für Details. Ansonsten ist onCreateView der richtige Ort, um dies zu tun @ N-AccessDevonActivityCreated()
der empfohlene Ort ist, um Verweise auf Ihre Ansichten zu finden und zu speichern. Sie müssen diese gespeicherten Referenzen bereinigen, indem Sie sie wieder aufnull
in setzenonDestroyView()
, da sonst die Referenz verloren gehtActivity
.Sie müssen das Fragment Sicht und Aufruf zum Aufblasen
findViewById()
auf denView
er zurückkehrt.quelle
NullPointerException
.Innerhalb der
Fragment
Klasse erhalten Sie die OnViewCreated () - Überschreibungsmethode, bei der Sie Ihre Ansichten immer initialisieren sollten, da Sie bei dieser Methode ein Ansichtsobjekt erhalten, mit dem Sie Ihre Ansichten wie folgt finden können:Denken Sie bei Fragment immer daran, dass diese
onViewCreated()
Methode nicht automatisch aufgerufen wird, wenn Sie null odersuper.onCreateView()
fromonCreateView()
method zurückgeben. Es wird standardmäßig bei aufgerufen wirdListFragment
alsListFragment
RückkehrFrameLayout
standardmäßig.Hinweis: Sie können die Fragmentansicht an einer beliebigen Stelle in der Klasse abrufen, indem Sie
getView()
einmalonCreateView()
erfolgreich ausführen. dhquelle
view
übergeben anonViewCreated
noch Ursachen,NullPointerException
aber die VerwendunggetActivity()
ist in Ordnung. Irgendwelche Ideen warum?onCreateView
Methode zurück. Ich habe gerade debuggt und es stellt sich heraus, dass es ein Layout gibt (in meinem FallFrameLayout
). Davon abgesehen, wenn ich versuche, ein Element zu finden, das zurückgegeben wirdnull
. Warum passiert es?Mir ist klar, dass dies eine alte Frage ist, aber die vorherrschende Antwort lässt zu wünschen übrig.
Die Frage ist nicht klar, was erforderlich ist
imageView
- geben wir sie als Ansicht zurück oder speichern wir lediglich eine Referenz für später?In beiden Fällen wäre der
ImageView
richtige Weg, dies zu tun , wenn das aus dem aufgeblasenen Layout stammt:quelle
Holen Sie sich zuerst die Fragmentansicht und dann aus dieser Ansicht Ihre ImageView.
quelle
Sie können dies auch in der
onActivityCreated
Methode tun .Wie hier: http://developer.android.com/reference/android/app/Fragment.html (veraltet in API-Level 28)
und
Sind möglich.
quelle
getView()
gibt die Root-Ansichtquelle
Sie können onViewCreated () überschreiben, das direkt aufgerufen wird, nachdem alle Ansichten aufgeblasen wurden. Hier können Sie die Mitgliedsvariablen Ihres Fragments ausfüllen
View
. Hier ist ein Beispiel:quelle
Innerhalb der
Fragment
Klasse erhalten wir eineonViewCreated()
Override-Methode, bei der wir unsere Ansichten immer initialisieren sollten, da wir bei dieser Methode einview
Objekt erhalten. Mit diesem Objekt können wir unsere Ansichten wie folgt finden:quelle
Die Methode getView () funktioniert nicht mit Fragmenten außerhalb von OnCreate und ähnlichen Methoden.
Sie haben zwei Möglichkeiten: Übergeben Sie die Ansicht an die Funktion in oncreate (was bedeutet, dass Sie Ihre Funktionen nur ausführen können, wenn die Ansicht erstellt wird) oder legen Sie die Ansicht als Variable fest:
quelle
1) Blasen Sie zuerst das Layout von Fragment auf, dann können Sie findviewbyId verwenden.
quelle
quelle
Verwenden
es wird klappen
quelle
stimmte dem Aufruf
findViewById()
der Ansicht zu.quelle
Hinweis :
Ab API-Ebene 26 müssen Sie das Ergebnis von findViewById auch nicht speziell umwandeln, da es Inferenz für seinen Rückgabetyp verwendet.
Jetzt können Sie einfach tun,
quelle
Gemäß der Dokumentation auf API-Ebene 11
Referenz im Back Stack http://developer.android.com/reference/android/app/Fragment.html
Funktionscode
quelle
Wenn Sie
getView()
die Ansicht des Fragments zurückgeben, können Sie aufrufen,findViewById()
um auf ein beliebiges Ansichtselement in der Fragmentansicht zuzugreifen.quelle
Versuchen Sie dies, es funktioniert für mich
quelle
Dies lässt sich am besten wie folgt umsetzen:
Auf diese Weise kann die rootView für jedes im XML-Layout definierte Steuerelement verwendet werden, und der Code ist auf diese Weise viel sauberer.
Hoffe das hilft :)
quelle
1) Deklarieren Sie Ihre Layoutdatei.
2) Dann holen Sie sich die ID Ihrer Ansicht
quelle
Wenn Sie das Gradle- Skeleton-Plugin verwenden , werden automatisch die Ansichtshalterklassen mit Bezug auf Ihr Layout generiert.
Angenommen, Sie haben eine
ImageView
Deklaration in Ihrermy_layout.xml
Datei, wird automatisch die myLayout-Klasse für Sie generiert.quelle
Versuche dies:
quelle
Versuchen
quelle
getView()
später anrufenSie können
findViewById()
mit dem Aktivitätsobjekt, das Sie in Ihrerpublic void onAttach(Activity activity)
Methode erhalten, innerhalb Ihres Fragments aufrufen .Speichern Sie die Aktivität in einer Variablen, zum Beispiel:
In der Fragment-Klasse :
private Activity mainActivity;
In deronAttach()
Methode:this.mainActivity=activity;
Führen Sie schließlich jede findViewById über die vairable aus:
mainActivity.findViewById(R.id.TextView);
quelle
Es gibt noch eine weitere Methode namens onViewCreated.
quelle
Innerhalb der onCreateView-Methode
1) Zuerst müssen Sie das Layout / die Ansicht aufblasen, die Sie hinzufügen möchten, z. LinearLayout
2) Dann finden Sie Ihre imageView-ID im Layout
3) Geben Sie das aufgeblasene Layout zurück
quelle
Sie müssen die Ansicht aufblasen
quelle
In Fragmenten benötigen wir eine Ansicht dieses Fensters, damit wir eine onCreateView dieses Fragments erstellen können.
Rufen Sie dann die Ansicht ab und verwenden Sie sie, um auf jede Ansichts-ID dieser Ansichtselemente zuzugreifen.
quelle
Hier kommt der Layout-Inflater ins Spiel. Layout Inflater ist eine Klasse, mit der wir die XML-Ansichten in Java-Code verwenden können. So können Sie die Root-XML-Ansicht in Variable v mit dem folgenden Code aufblasen. Mit v können Sie dann die untergeordneten Ansichten der Stammansicht v finden.
quelle
Der einfachste Weg, solche Dinge zu verwenden, ist die Verwendung von Buttermesser. Auf diese Weise können Sie mit @OnClick () so viele Onclciklistener hinzufügen, wie unten beschrieben:
quelle