Принудительное включение onLayout в подвиде, размеры которого не меняются

У меня есть обычай ViewGroup с некоторыми взглядами внутри.

В ответ на событие вызывается requestLayout и в OnLayout некоторые виды получат новую позицию макета.

Один из них сохраняет свою позицию, но его нужно переставить внутрь. Однако метод onlayout этого представления не будет вызываться, так как его расположение не изменяется. Пытаюсь позвонить requestLayout, forceLayout или же invalidate в этом представлении не работает.

Единственный подвох, который я обнаружил, - это изменить некоторые его значения, чтобы вызвать изменение макета, но я думаю, что должен быть лучший способ. Итак, сейчас я делаю что-то (ужасное) вроде:

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

Есть ли способ получить тот же результат лучше?

1 ответ

Решение

Я наконец получил решение: мне нужно переопределить onMeasure и обязательно позвони mesure по-моему:

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

Он установит флаг LAYOUT_REQUIRED в закрытом поле представления mPrivateFlags, поэтому вызовет onLayout

Другие вопросы по тегам