Was nützt LayoutInflater
Android?
android
layout-inflater
android-inflate
user386430
quelle
quelle
Antworten:
Wenn Sie eine benutzerdefinierte Ansicht in a verwenden
ListView
, müssen Sie das Zeilenlayout definieren. Sie erstellen eine XML-Datei, in der Sie Android-Widgets platzieren, und im Code des Adapters müssen Sie Folgendes tun:Lesen Sie mehr in der offiziellen Dokumentation .
quelle
View view = convertView; if (view == null) { view = mInflater.... }
LayoutInflater
ist, obwohl es erklärt, wo es verwendet werden soll. Die Antwort 1-down ist besser.Die LayoutInflater- Klasse wird verwendet, um den Inhalt von Layout-XML-Dateien in die entsprechenden View-Objekte zu instanziieren.
Mit anderen Worten, es wird eine XML-Datei als Eingabe verwendet und die View-Objekte daraus erstellt.
quelle
single_list_item.xml
Datei für jede Zeile von aListView
. Ist die Verwendung dieser XML-Datei wie ein Inflater?Was macht
LayoutInflator
dasAls ich mit der Android-Programmierung anfing, war ich wirklich verwirrt von
LayoutInflater
undfindViewById
. Manchmal haben wir das eine und manchmal das andere benutzt.LayoutInflater
wird verwendet, um ein neuesView
(oderLayout
) Objekt aus einem Ihrer XML-Layouts zu erstellen.findViewById
gibt Ihnen nur einen Verweis auf eine Ansicht, die bereits erstellt wurde. Man könnte denken , dass Sie keine Ansichten noch erstellt haben, aber wenn Sie rufensetContentView
inonCreate
, das Layout der Tätigkeit zusammen mit seiner Subviews aufgeblasen wird (erstellt) hinter den Kulissen.Wenn die Ansicht bereits vorhanden ist, verwenden Sie
findViewById
. Wenn nicht, erstellen Sie es mit einemLayoutInflater
.Beispiel
Hier ist ein Mini-Projekt, das ich gemacht habe und das sowohl zeigt
LayoutInflater
als auchfindViewById
in Aktion ist. Ohne speziellen Code sieht das Layout folgendermaßen aus.Das blaue Quadrat ist ein benutzerdefiniertes Layout, das mit in das Hauptlayout eingefügt wird
include
(siehe hier für weitere Informationen). Es wurde automatisch aufgeblasen, da es Teil der Inhaltsansicht ist. Wie Sie sehen können, hat der Code nichts Besonderes.Lassen Sie uns nun eine weitere Kopie unseres benutzerdefinierten Layouts aufblasen (erstellen) und hinzufügen.
Um das neue Ansichtslayout aufzublähen, habe ich dem Inflater lediglich den Namen meiner XML-Datei (
my_layout
) mitgeteilt , das übergeordnete Layout, zu dem ich es hinzufügen möchte (mainLayout
), und das ich noch nicht hinzufügen möchte (false
) . (Ich könnte auch die Eltern auf einstellennull
, aber dann werden die Layoutparameter der Stammansicht meines benutzerdefinierten Layouts ignoriert.)Hier ist es wieder im Kontext.
Beachte wie
findViewById
nur verwendet wird, nachdem ein Layout bereits aufgeblasen wurde.Ergänzungscode
Hier ist die XML für das obige Beispiel.
activity_main.xml
my_layout.xml
Wann brauchen Sie LayoutInflater?
RecyclerView
. (In diesenRecyclerView
Beispielen finden Sie eine Liste oder ein Raster Sie in .) Sie müssen für jedes einzelne sichtbare Element in der Liste oder im Raster ein neues Layout aufblasen.quelle
myLayout
ist eine Ansicht, obwohl ich sie als RelativeLayout hätte aufblasen können (siehe my_layout.xml). Nachdem es aufgeblasen ist, füge ich es als Unteransicht des LinearLayout-übergeordneten Elements (dhmainLayout
) hinzu.LayoutInflater.inflate () bietet eine Möglichkeit, eine res / layout / *. Xml-Datei, die eine Ansicht definiert, in ein tatsächliches View-Objekt zu konvertieren, das in Ihrem Anwendungsquellcode verwendet werden kann.
Grundlegende zwei Schritte: Holen Sie sich den Inflater und blasen Sie dann die Ressource auf
Wie bekommt man den Inflater?
Wie erhalten Sie die Ansicht, wenn die XML-Datei "list_item.xml" lautet?
quelle
Hier ist ein weiteres Beispiel ähnlich dem vorherigen, das jedoch erweitert wurde, um die Aufblasparameter und das dynamische Verhalten, das es bieten kann, weiter zu demonstrieren.
Angenommen, Ihr ListView-Zeilenlayout kann eine variable Anzahl von TextViews enthalten. Zuerst blasen Sie die Basiselementansicht auf (genau wie im vorherigen Beispiel) und fügen dann zur Laufzeit dynamisch TextViews hinzu. Mit android: layout_weight richtet zusätzlich alles perfekt aus.
Hier sind die Ressourcen für Layouts:
list_layout.xml
schedule_layout.xml
Außer Kraft setzen getView Verfahren in Erweiterung der Klasse BaseAdapter
Beachten Sie verschiedene Aufrufe der Inflate-Methode:
quelle
Diese Klasse wird verwendet, um Layout-XML-Dateien in die entsprechenden
View
Objekte zu instanziieren . Es wird niemals direkt verwendet - verwendengetLayoutInflater()
odergetSystemService(String)
zum Abrufen einer StandardinstanzLayoutInflater
, die bereits mit dem aktuellen Kontext verbunden und für das Gerät, auf dem Sie ausgeführt werden, korrekt konfiguriert ist. Zum Beispiel:Referenz: http://developer.android.com/reference/android/view/LayoutInflater.html
quelle
Aufblasen bedeutet, die XML-Datei zu lesen, die ein Layout (oder ein GUI-Element) beschreibt, und die tatsächlichen Objekte zu erstellen, die diesem entsprechen, und so das Objekt in einer Android-App sichtbar zu machen.
Diese Datei könnte als date_time_dialog.xml gespeichert werden :
Diese Datei könnte als date_time_picker.xml gespeichert werden :
Die
MainActivity
als MainActivity.java gespeicherte Klasse :quelle
Was macht der Inflater?
Es nimmt ein XML-Layout als Eingabe (z. B.) und konvertiert es in ein View-Objekt.
Warum gebraucht
Stellen wir uns ein Szenario vor, in dem wir eine benutzerdefinierte Listenansicht erstellen müssen. Jetzt sollte jede Zeile benutzerdefiniert sein. Aber wie können wir das machen? Es ist nicht möglich, einer Zeile mit Listenansicht ein XML-Layout zuzuweisen. Also erstellen wir ein View-Objekt. Auf diese Weise können wir auf die darin enthaltenen Elemente (Textansicht, Bildansicht usw.) zugreifen und das Objekt auch als Zeile der Listenansicht zuweisen
Wenn wir also irgendwo ein Objekt vom Typ Ansicht zuweisen müssen und unser benutzerdefiniertes XML-Design haben, konvertieren wir es einfach per Inflater in ein Objekt und verwenden es.
quelle
LayoutInflater ist eine Klasse, mit der Layout-XML-Dateien in die entsprechenden Ansichtsobjekte instanziiert werden, die in Java-Programmen verwendet werden können. In einfachen Worten gibt es zwei Möglichkeiten, eine Benutzeroberfläche in Android zu erstellen. Einer ist statisch und ein anderer dynamisch oder programmgesteuert. Angenommen, wir haben ein einfaches Layout main.xml mit einem
textview
und einemedittext
wie folgt.Wir können dieses Layout statisch anzeigen, indem wir
Eine dynamische Art, eine Ansicht zu erstellen, bedeutet, dass die Ansicht in unserer main.xml nicht erwähnt wird, wir sie jedoch zur Laufzeit anzeigen möchten. Zum Beispiel haben wir ein anderes XML im Layoutordner als footer.xml
Wir möchten dieses Textfeld zur Laufzeit in unserer Hauptbenutzeroberfläche anzeigen. Also hier werden wir text.xml aufblasen. Siehe wie:
Hier habe ich getSystemService (String) verwendet, um eine LayoutInflater-Instanz abzurufen. Ich kann auch getLayoutInflator () zum Aufblasen verwenden, anstatt getSystemService (String) wie unten zu verwenden:
quelle
Hier ist ein Beispiel für das Abrufen einer Referenz für die Stammansicht eines Layouts, das Aufblasen und die Verwendung mit setContentView (Ansichtsansicht).
quelle
Layout Inflater ist eine Klasse, die die Beschreibung des XML-Erscheinungsbilds liest und sie in Java-basierte View-Objekte konvertiert.
quelle
Meine benutzerdefinierte Liste hoffe, dass es das Konzept illustriert
quelle
LayoutInflater ist eine grundlegende Komponente in Android. Sie müssen es ständig verwenden, um XML-Dateien in Ansichtshierarchien umzuwandeln.
quelle
LayoutInflater erstellt Ansichtsobjekte basierend auf in XML definierten Layouts. Es gibt verschiedene Möglichkeiten, LayoutInflater zu verwenden, z. B. das Erstellen benutzerdefinierter Ansichten, das Aufblasen von Fragmentansichten in Aktivitätsansichten, das Erstellen von Dialogen oder das einfache Aufblasen einer Layoutdateiansicht in eine Aktivität.
Es gibt viele Missverständnisse darüber, wie der Inflationsprozess funktioniert. Ich denke, das liegt an der schlechten Dokumentation für die inflate () -Methode. Wenn Sie mehr über die inflate () -Methode erfahren möchten, habe ich hier einen Blog-Beitrag darüber geschrieben:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
quelle
Inflater konvertiert tatsächlich eine Art Konvertierung in Daten, Ansichten, Instanzen, in sichtbare UI-Darstellungen. Dadurch werden Daten verwendet, die möglicherweise von Adaptern usw. programmgesteuert eingegeben werden. Integrieren Sie es dann in eine von Ihnen definierte XML-Datei, die angibt, wie die Daten in der Benutzeroberfläche dargestellt werden sollen
quelle