2016-07-02 4 views
0

DER CONTEXTInset Kind sieht in einer Unterklasse von Viewgroup ohne die onLayout- zu Umschreiben() -Implementierung

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 CardViewsetContentPadding() 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?

+0

ich bin nicht 100% sicher, aber du könntest versuchen, deine Logik auf 'onLayout's Bruder anzuwenden:' onMeasure' – pskink

+0

@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

+0

ah ok Vergiss, was ich vorher gesagt habe, aber kannst du nicht einfach die 4 internen Paddings mit deinen Werten erhöhen? – pskink

Antwort

1

Es funktioniert nicht, weil Breite und Höhe Attribute sind, die Informationen für das übergeordnete Element der Ansicht bereitstellen. Alles, was mit Layout_ beginnt, ist eine Anweisung an den Elternteil. In Ihrem Fall onLayout sollen Sie die untergeordneten Elemente der ViewGroup anordnen und die Dimensionen der aktuellen Ansicht nicht ändern. In OnMeasure messen Sie die Kinder. Und onLayout ist, wo Sie sie positionieren. Sie können alle Kinder einrücken, wenn Sie in onLayout möchten, aber Sie können es nicht tun, wenn Sie den Eltern anrufen. This post may help understand build custom ViewGroup Ich empfehle, dass Sie ViewGroup erweitern und nur ein untergeordnetes Element in der benutzerdefinierten ViewGroup haben, dann das untergeordnete Element auf dieselbe Größe wie Ihre benutzerdefinierte Ansichtsgruppe ausrichten, während Sie den Schatten anpassen.Auf diese Weise können Sie einen Schatten auf Ihre benutzerdefinierte ViewGroup setzen und gleichzeitig das Zeichnen außerhalb der Grenzen vermeiden. Dies ist der einfachste Ansatz. Sie können jedes Kind individuell gestalten, wenn Sie möchten. Wenn die neue ConstraintsLayout-Option verwendet wird, kann dies außerdem die Verwendung einer benutzerdefinierten ViewGroup verhindern.

+0

Ich habe Quellcodes für die letzten Stunden angesehen. Ja, alle Zeichen weisen in diese Richtung. Danke für die Bestätigung! – fahmy

Verwandte Themen