2013-12-21 16 views
16

は、誰がどのように次のトレースを修正する教えてもらえます:ここでトレース: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); 
} 

} 
+0

私はちょうど今日、同じ問題に遭遇し、それがことが表示されますログ内のビューは原因ではありません。 ValueAnimatorや別のAnimatorクラスをコード内で使用しますか? – Kai

+0

私はしません。すべてのコードは、ユーザーがスクロールするときにアルファを設定しながら、イメージをフェッチし、ブラーして元のイメージに置きます。 – Aashir

+0

ええと...まだ問題が残っている場合は、UIスレッド関連のコードをチェックするだけです。私のコードの問題は、私が 'ValueAnimator.start()'を連続して複数回呼び出したことでした。そして、私がValueAnimatorからUI関連のコードを削除したとしても、** requestLayout()が不適切に呼び出されていることに気づいています。ああ、それは4.3デバイスでも起こるようです。 – Kai

答えて

13

here見られるように、setScaleTypeはrequestLayoutを呼び出しますが、ImageViewののコンストラクタは、すでに呼び出しますそれ以前。そのため、レイアウトで複数のrequestLayoutが呼び出されます.1つはレイアウト・パス中に呼び出されます。小規模では問題ではないため、警告です。

thisスレッドでいい研究があります(しかし、ロボギスの部分ではありません)。

2

superLayout()を呼び出した後にonLayoutメソッドで子ビューのレイアウトパラメータを変更しました。再帰につながる : - >親ビューonRequestLayout() -

Childlayoutのparamsが変更>親ビューonLayout - > childview paramsが変更 - > ...

+0

私が作成したカスタムの 'TableLayout'クラスでは、同じ問題がありました。私の 'TableLayout'内の' EditText'がフォーカスを持っていた場合、警告を表示するだけでなく、スクロールを防ぐこともできました。 'supoer.onLayout'を' onLayout'メソッドの一番下に移動すると解決しました。 +1 – Springrbua

関連する問題