Ich habe eine XML-Definition für eine Ansicht, die ich mit addChild zu einer größeren Containeransicht hinzufüge. Es basiert auf einem LinearLayout
und sieht grundsätzlich so aus:
(Rest weggelassen - wahrscheinlich nicht relevant, da es im Grunde wie geplant funktioniert)
Beim Erstellen dieser Ansichten habe ich die folgenden Verhaltensweisen gefunden, die mir seltsam erscheinen:
Gleich nach dem Aufblasen der Ansicht gibt getLayoutParameters () null zurück.
Nachdem ich addChild () aufgerufen habe, um es dem übergeordneten Element hinzuzufügen, gibt getLayoutParameters () ein gültiges Objekt zurück.
Wenn ich die LayoutParameter untersuche, finde ich sowohl width als auch height auf -2 (WRAP_CONTENT) gesetzt, was eindeutig nicht der ist, was ich in der XML-Datei angegeben habe.
Wenn ich mir die Layout-Parameter des beigefügten ImageView ansehe, liest er die angegebenen Werte aus.
Kann mir jemand erklären, was hier vor sich geht? Warum wird meine angegebene Höhe nicht beachtet?
Das betrifft mich nicht wirklich, da die Elternansicht eine benutzerdefinierte Ansicht ist, in der ich die endgültigen Dimensionen der Kinder mit MeasureSpec usw. erzwinge, aber ich würde das trotzdem gerne verstehen!
Sie haben einige wichtige Details nicht angegeben.
1) Gleich nachdem ich die Ansicht aufgebläht habe, gibt getLayoutParameters () null zurück.
Ich würde annehmen, dass du das benutzt hast:
%Vor% in diesem Fall kann die LayoutInflater
nicht (richtig) LayoutParams
für die Wurzel Linearlayout
machen, weil sie nicht weiß, wer ihre Eltern sein wird (damit sie den richtigen Typ erstellen kann) %Code%). Wenn Sie dies verwenden würden:
Dann wird das root LayoutParams
das richtige LinearLayout
haben, weil es den Typ von LayoutParams
sehen und das someOtherLayout
aus dieser Information erzeugen wird. Vielleicht möchten Sie ein Code-Snippet bereitstellen, um eine bessere Antwort zu erhalten, wenn dies nicht das ist, was Sie gerade tun.
2) Nachdem ich addChild () aufgerufen habe, um es zu seinem Eltern hinzuzufügen, getLayoutParameters () gibt ein gültiges Objekt zurück.
Ich nehme an, dass Sie über die Methode LayoutParams
sprechen. Die addView()
-Methode überprüft die addView()
der Ansicht, die versucht hinzuzufügen, und wenn diese LayoutParams
LayoutParams
sind, dann wird dieser Ansicht automatisch ein null
-Objekt zugewiesen, das von ihrer LayoutParams
-Methode zurückgegeben wird.
3) Untersucht man die LayoutParameter, finde ich sowohl die Breite als auch die Höhe auf -2 (WRAP_CONTENT), was eindeutig nicht ist, was ich in der XML-Datei angegeben habe.
Wie ich bereits unter Punkt 2 erwähnt habe, stammen die generierten generateDefaultLayoutParams()
von der LayoutParams
-Methode, die eine generateDefaultLayoutParams()
-Instanz zurückgibt, wie es für das übergeordnete Element vorgesehen war. Beispiel: Ein LayoutParams
mit der Ausrichtung LinearLayout
(der Standardwert) gibt eine HORIZONTAL
-Instanz zurück, deren Breite / Höhe auf LayoutParams
gesetzt ist.
4) Wenn ich mir die Layoutparameter des beiliegenden ImageView anschaue, dann liest bei den angegebenen Werten aus.
Weil WRAP_CONTENT
sich darum gekümmert hat, da LayoutInflater
sich im Inneren des Layouts befindet und einen bekannten Elternteil hat, aus dem ImageView
die richtige LayoutInflater
machen kann.
Tags und Links android android-layout layout-inflater