Unerwartete LayoutParams mit einem überhöhten LinearLayout

8

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:

%Vor%

(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:

  1. Gleich nach dem Aufblasen der Ansicht gibt getLayoutParameters () null zurück.

  2. Nachdem ich addChild () aufgerufen habe, um es dem übergeordneten Element hinzuzufügen, gibt getLayoutParameters () ein gültiges Objekt zurück.

  3. 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.

  4. 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!

    
gordonwd 21.12.2012, 18:57
quelle

1 Antwort

21

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:

%Vor%

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.

    
Luksprog 21.12.2012, 20:01
quelle