2012-07-05 12 views
6

Mam niestandardowy ViewGroup z pewnymi widokami w środku.wymuszanie onLayout w subView, którego wymiary się nie zmieniają

W odpowiedzi na zdarzenie wywoływana jest opcja requestLayout, a w niektórych widokach otrzymuje nową pozycję układu.

Jedna z nich zachowuje swoją pozycję, ale musi zostać uporządkowana wewnątrz. Jednak metoda onlayout tego widoku nie zostanie wywołana, ponieważ jego pozycja układu nie ulegnie zmianie. Próba wywołania requestLayout, forceLayout lub invalidate w tym widoku nie działa.

Jedyną brudną sztuczką, którą znalazłem, jest zmiana niektórych jej pozycji wartości, aby wymusić zmianę układu, ale myślę, że powinien istnieć lepszy sposób. Tak więc, teraz robię coś (strasznego) jak:

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; 
     ... 
    }  

Jakikolwiek sposób, aby uzyskać ten sam wynik w lepszy sposób?

Odpowiedz

4

I wreszcie rozwiązanie: trzeba zastąpić onMeasure i należy zadzwonić mesure moim zdaniem:

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

Będzie ustawić LAYOUT_REQUIRED flagę w prywatnych mPrivateFlags pole widoku, tak zmusi zadzwonić onLayout