Подтвердить что ты не робот

Trace: requestLayout() неправильно вызван?

Может ли кто-нибудь сказать мне, как исправить следующую трассировку:

W/View    (16810): requestLayout() improperly called by 
theme.effects.TopCenterImageView{41dc73f0 V.ED.... ........ 
0,0-480,690 #7f060066 app:id/normal_image} during second 
layout pass: posting in next frame

Вот код для TopCenterImageView:

public class TopCenterImageView extends ImageView {

public TopCenterImageView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    setScaleType(ScaleType.MATRIX);
}

public TopCenterImageView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setScaleType(ScaleType.MATRIX);
}

public TopCenterImageView(Context context) {
    super(context);
    setScaleType(ScaleType.MATRIX);
}

@Override
protected boolean setFrame(int l, int t, int r, int b) {
    if (getDrawable() == null) {
        return super.setFrame(l, t, r, b);
    }
    Matrix matrix = getImageMatrix();
    float scaleFactor = getWidth() / (float) getDrawable().getIntrinsicWidth();
    matrix.setScale(scaleFactor, scaleFactor, 0, 0);
    setImageMatrix(matrix);
    return super.setFrame(l, t, r, b);
}

}
4b9b3361

Ответ 1

Как видно здесь, setScaleType будет вызывать requestLayout, но конструктор ImageView уже вызывает его раньше. Таким образом, это приведет к тому, что макет будет иметь несколько запросов requestLayout, один во время прохода макета. Это просто предупреждение, потому что в небольших масштабах это не проблема.

Вы найдете неплохие исследования в этом потоке (но не в части roboguice).

Ответ 2

Я изменил параметры макета представления child в методе onLayout ПОСЛЕ вызова super.onLayout(); Это приводит к рекурсии:

Изменены параметры Childlayout → родительский вид onRequestLayout() → родительский вид onLayout → изменены параметры childview → ...