web-dev-qa-db-ja.com

トレース: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);
}

}
19
Aashir

ご覧のとおり here の場合、setScaleTypeはrequestLayoutを呼び出しますが、ImageViewのコンストラクターはすでにそれを呼び出しています。したがって、レイアウトパス中に1つずつ呼び出される複数のrequestLayoutがレイアウトに発生します。小規模では問題ではないため、これは単なる警告です。

this スレッド(roboguiceの部分ではありません)でいくつかの良い研究を見つけるでしょう。

16
NitroG42

Super.onLayout()を呼び出した後、onLayoutメソッドで子ビューのレイアウトパラメータを変更しました。それは再帰につながります:

変更された子レイアウトパラメータ->親ビューonRequestLayout()->親ビューonLayout->変更された子ビューパラメータ-> ...

2
stoefln