跟踪:requestLayout()调用不正确?

时间:2013-12-21 08:19:28

标签: android stack-trace

任何人都可以告诉我如何修复以下痕迹:

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

}

3 个答案:

答案 0 :(得分:16)

here所示,setScaleType将调用requestLayout,但ImageView的构造函数之前已经调用它。因此,它将导致布局在布局过程中调用多个requestLayout。这只是一个警告,因为在一个小规模,这不是一个问题。

你会在this帖子中找到一些好的研究(不过roboguice部分)。

答案 1 :(得分:2)

我在调用super.onLayout()之后在onLayout方法中更改了子视图布局参数; 这会导致递归:

Childlayout params已更改 - >父视图onRequestLayout() - >父视图onLayout - > childview params改变了 - > ...

答案 2 :(得分:0)

解决方案:


使用已更改参数作为更改检查。

override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
    super.onLayout(changed, left, top, right, bottom)
    Log.i(TAG, "onLayout: $changed")
    if (changed) {
        changeDefaultView(size)
    }
}

改变等于:

TRUE - 当布局与之前相比 CHANGED 时。

FALSE - 与之前的布局相比没有改变