2012-07-05 6 views
6

Ich habe eine benutzerdefinierte ViewGroup mit einigen Ansichten im Inneren.force onLayout in einer Unteransicht, deren Abmessungen sich nicht ändern

Als Reaktion auf ein Ereignis wird ein requestLayout aufgerufen, und in erhalten einige der Ansichten eine neue Layoutposition.

Einer von ihnen behält seine Position bei, muss aber im Inneren neu angeordnet werden. Die Onlayout-Methode dieser Ansicht wird jedoch nicht aufgerufen, da sich ihre Layoutposition nicht ändert. Der Versuch, requestLayout, forceLayout oder invalidate in dieser Ansicht aufzurufen, funktioniert nicht.

Der einzige schmutzige Trick, den ich gefunden habe, ist, etwas von seiner Wertposition zu ändern, um das Layout zu ändern, aber ich denke, dass es einen besseren Weg geben sollte. So, jetzt mache ich etwas (schrecklich) wie:

int patch = 0; 
    @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     ... 
     _myView.patchedLayout(patch); 
     _myview.layout(l1, t1 , r1, t1+patch); 
     patch = (patch+1) % 2; 
     ... 
    }  

Jeder Weg, um das gleiche Ergebnis auf eine bessere Weise zu bekommen?

Antwort

4

Ich habe endlich die Lösung: Ich brauche onMeasure außer Kraft zu setzen und sicher sein, mesure meiner Ansicht nach nennen:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    ... 
    _myview.measure(widthMeasureSpec, heightMeasureSpec); 
    ... 

Es wird die LAYOUT_REQUIRED Flagge im privaten Bereich mPrivateFlags Sicht gesetzt, so zu nennen es zwingen wird, zu onLayout

Verwandte Themen