Ich versuche, eine benutzerdefinierte Ansicht zu erstellen, die die LinearLayout
erstreckt. Kurz gesagt, zieht diese Ansicht ihren eigenen Hintergrund durch Überschreiben View.onDraw()
Methode. Der Hintergrund hat einen Schatten um ihn herum (ähnlich wie der CardView
).
DAS ZIEL
Da der Hintergrund mit einem Schatten, wie die Karte Ansicht ist, sollten Kind Ansichten nicht in der gesamten Ansicht zu füllen erlaubt werden. Fixed Padding sollte für die Schatten um die Karte verlassen werden. Diese Auffüllung sollte nicht durch das vom xml padding-Attribut oder setPadding()
festgelegte Padding erfolgen. Es ist etwas ähnlich wie die CardView
setContentPadding()
Methode.
Der Ansatz
Ich versuche, dies zu erreichen, indem das Überschreiben der onLayout()
Methode der LinearLayout
. Die offizielle Dokumentation lautet:
Wird vom Layout aufgerufen, wenn diese Ansicht den einzelnen untergeordneten Elementen eine Größe und Position zuweisen soll. Abgeleitete Klassen mit Kindern sollten diese Methode überschreiben und das Layout für jedes ihrer untergeordneten Elemente aufrufen.
Die LinearLayout
‚s Umsetzung der onLayout()
gut funktioniert meinem Fall arbeiten. Also möchte ich nicht die gesamte Implementierung neu schreiben. So habe ich versucht, dies die onLayout()
Methode in meiner benutzerdefinierten Klasse durch zwingende zu erreichen und die Änderung der super gebenen Argumente für den Schatten zu erklären, wie unten dargestellt:
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(
changed,
left + shadowSize,
top + shadowSize,
right - shadowSize,
bottom - shadowSize
);
}
DAS PROBLEM
Das Problem ist jedoch ist, dass dies keine Auswirkungen auf die LinearLayout
Kinder hat. Egal, welche Werte ich an Super übergebe, die Kinderansichten bleiben gleich.
DIE FRAGE
Warum ist dies nicht funktioniert? Oder, was ist der beste Ansatz, um eine inhaltliche Einfügung/Auffüllung für Klassen wie die LinearLayout
zu erreichen, die bereits eine onLayout()
Implementierung haben, die ich nicht ändern oder umschreiben möchte?
ich bin nicht 100% sicher, aber du könntest versuchen, deine Logik auf 'onLayout's Bruder anzuwenden:' onMeasure' – pskink
@pskink onMeasure würde den Raum einschränken, den ich für den Hintergrund habe. Ich möchte, dass der Hintergrund den gesamten Bereich einnimmt und nur die untergeordneten Ansichten einfügt. – fahmy
ah ok Vergiss, was ich vorher gesagt habe, aber kannst du nicht einfach die 4 internen Paddings mit deinen Werten erhöhen? – pskink