Ich hatte ernsthafte Probleme damit, LayoutInflater wie erwartet zum Laufen zu bringen, und andere Leute auch: Wie verwende ich Layoutinflator, um zur Laufzeit Ansichten hinzuzufügen? .
Warum ignoriert LayoutInflater die von mir angegebenen Layoutparameter? ZB warum werden die layout_width
und layout_height
Werte aus meinen Ressourcen XML nicht berücksichtigt?
android
android-layout
andig
quelle
quelle
Antworten:
Ich habe dieses Problem untersucht, mich auf die LayoutInflater-Dokumente bezogen und ein kleines Beispiel-Demonstrationsprojekt eingerichtet. Die folgenden Tutorials zeigen, wie Sie ein Layout mithilfe dynamisch füllen
LayoutInflater
.Bevor wir anfangen, sehen Sie, wie
LayoutInflater.inflate()
Parameter aussehen:R.layout.main_page
)attachToRoot
isttrue
) oder auch nur ein Objekt , das einen Satz liefertLayoutParams
Werte für die Wurzel der Hierarchie zurückgeführt (wennattachToRoot
istfalse
) .attachToRoot : Soll die aufgeblasene Hierarchie an den Root-Parameter angehängt werden? Wenn false, wird root nur verwendet, um die richtige Unterklasse
LayoutParams
für die Root-Ansicht im XML zu erstellen .Rückgabe : Die Stammansicht der aufgeblasenen Hierarchie. Wenn root angegeben wurde und
attachToRoot
isttrue
, ist dies root; Andernfalls ist es das Stammverzeichnis der aufgeblasenen XML-Datei.Nun zum Beispiellayout und Code.
Hauptlayout (
main.xml
):In diesen Container wird eine separate Textansicht eingefügt, die als kleines rotes Quadrat angezeigt wird, wenn Layoutparameter erfolgreich aus XML (
red.xml
) angewendet werden :Wird jetzt
LayoutInflater
mit verschiedenen Variationen von Aufrufparametern verwendetDie tatsächlichen Ergebnisse der Parametervariationen sind im Code dokumentiert.
ÜBERSICHT: Das Aufrufen
LayoutInflater
ohne Angabe von root führt zu einem Anstieg des Anrufs, wobei die Layoutparameter aus dem XML ignoriert werden. Der Aufruf von inflate mit root ist nicht gleichnull
undattachRoot=true
lädt die Layoutparameter, gibt jedoch das Root-Objekt erneut zurück, wodurch weitere Layoutänderungen am geladenen Objekt verhindert werden (es sei denn, Sie finden es mitfindViewById()
). Die aufrufende Konvention, die Sie höchstwahrscheinlich verwenden möchten, lautet daher:Um Hilfe bei der Layout - Probleme, die Layout - Inspektor ist sehr zu empfehlen.
quelle
Activity
ist UnterklasseContext
und die Antwort der Beispiele sind in UmfangActivity
, so macht es einfacher , ich ersetztgetBaseContext()
mit ,this
wie zum Zweck dieser Antwort, es ist gleichwertig.andig ist richtig, dass ein häufiger Grund dafür, dass LayoutInflater Ihre layout_params ignoriert, darin besteht, dass kein Stamm angegeben wurde. Viele Leute denken, Sie können null für root übergeben. Dies ist für einige Szenarien akzeptabel, z. B. für ein Dialogfeld, in dem Sie zum Zeitpunkt der Erstellung keinen Zugriff auf root haben. Eine gute Regel ist jedoch, wenn Sie root haben, geben Sie es LayoutInflater.
Ich habe einen ausführlichen Blog-Beitrag darüber geschrieben, den Sie hier lesen können:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
quelle
This is acceptable for a few scenarios such as a dialog
das war alles was ich brauchteIch möchte der Hauptantwort oben hinzufügen. Ich habe versucht, ihr zu folgen, aber mein recyclerView begann, jedes Element auf einen Bildschirm zu dehnen, den
ich nach dem Aufblasen in die nächste Zeile einfügen musste, um das Ziel zu erreichen
Ich habe diese Parameter bereits per XML hinzugefügt, aber es hat nicht richtig funktioniert
und mit dieser Zeile ist alles in Ordnung
quelle