2013-12-21 9 views
16

Kann mir jemand sagen, wie die folgende Spur zu beheben:Trace: requestLayout() falsch aufgerufen?

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 

Hier ist der Code für 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

ich das gleiche Problem heute nur festgestellt und es scheint, dass Die Ansicht im Protokoll ist nicht der Übeltäter. Verwenden Sie in Ihrem Code ValueAnimator oder eine andere Animator-Klasse? – Kai

+0

Ich nicht. Der ganze Code ist einfach so, dass er ein Bild abruft, es verwischt und es über das Original legt, während das Alpha eingestellt wird, während der Benutzer scrollt. – Aashir

+0

Hmm ... wenn es immer noch ein Problem für dich ist, denke ich, das einzige, was noch zu tun ist, ist UI-Thread-bezogenen Code zu überprüfen. Das Problem mit meinem Code war, dass ich 'ValueAnimator.start()' mehrere Male in schneller Folge aufgerufen hatte. Und das Seltsamste ist, dass ich immer noch den Fehler ** "requestLayout() falsch aufgerufen ..." ** sehen würde, selbst wenn ich einen mit der Benutzeroberfläche verbundenen Code aus ValueAnimator entfernt hätte. Oh, und es scheint nur auf 4.3 Geräten zu passieren. – Kai

Antwort

13

Als here gesehen, setScaleType requestLayout nennen, aber der Konstruktor von Image bereits nennen es vorher. Dies führt dazu, dass das Layout mehrere requestLayouts aufgerufen hat, eines während des Layout-Durchlaufs. Es ist nur eine Warnung, weil es im kleinen Maßstab kein Problem ist.

Sie finden einige gute Forschung in this Thread (nicht die Roboguice Teil obwohl).

2

Ich änderte ein Kind sieht Layoutparameter in der onLayout-Methode NACH dem Aufruf von super.onLayout(); , die zu einer Rekursion führen:

Childlayout params geändert -> übergeordnete Ansicht onRequestLayout() -> übergeordnete Ansicht onLayout- -> childview params geändert -> ...

+0

In einer benutzerdefinierten 'TableLayout' Klasse, die ich erstellt habe, hatte ich das gleiche Problem. Es zeigte nicht nur die Warnung, sondern verhinderte auch das Scrollen, wenn ein 'EditText' in meinem' TableLayout' den Fokus hatte. Das Verschieben von 'supoer.onLayout' zum Ende meiner' onLayout' Methode löste es. +1 – Springrbua