2013-06-13 1 views
2

J'ai codé ma propre mise en page (sous-classe d'un RelativeLayout). Je vois à partir du débogueur que onMeasure() et onLayout() sont appelés en continu. Est-ce un comportement normal? La trace de la pile commence à partir d'un DispatchMessage():Disposition personnalisée, onMeasure/onLayout appelée en continu

Synoptic.onMeasure(int, int) line: 125 
Synoptic(View).measure(int, int) line: 12727  
RelativeLayout.measureChildHorizontal(View, RelativeLayout$LayoutParams, int, int) line: 594  
RelativeLayout.onMeasure(int, int) line: 376  
RelativeLayout(View).measure(int, int) line: 12727 
LinearLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) line: 4698  
LinearLayout.measureChildBeforeLayout(View, int, int, int, int, int) line: 1369 
LinearLayout.measureHorizontal(int, int) line: 1017 
LinearLayout.onMeasure(int, int) line: 555 
LinearLayout(View).measure(int, int) line: 12727  
SwipeView(HorizontalScrollView).measureChildWithMargins(View, int, int, int, int) line: 1159  
SwipeView(FrameLayout).onMeasure(int, int) line: 293  
SwipeView(HorizontalScrollView).onMeasure(int, int) line: 303 
SwipeView(View).measure(int, int) line: 12727 
LinearLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) line: 4698  
LinearLayout.measureChildBeforeLayout(View, int, int, int, int, int) line: 1369 
LinearLayout.measureVertical(int, int) line: 660  
LinearLayout.onMeasure(int, int) line: 553 
LinearLayout(View).measure(int, int) line: 12727  
LinearLayout.measureVertical(int, int) line: 812  
LinearLayout.onMeasure(int, int) line: 553 
LinearLayout(View).measure(int, int) line: 12727  
FrameLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) line: 4698 
FrameLayout.onMeasure(int, int) line: 293 
FrameLayout(View).measure(int, int) line: 12727 
LinearLayout(ViewGroup).measureChildWithMargins(View, int, int, int, int) line: 4698  
LinearLayout.measureChildBeforeLayout(View, int, int, int, int, int) line: 1369 
LinearLayout.measureVertical(int, int) line: 660  
LinearLayout.onMeasure(int, int) line: 553 
LinearLayout(View).measure(int, int) line: 12727  
PhoneWindow$DecorView(ViewGroup).measureChildWithMargins(View, int, int, int, int) line: 4698 
PhoneWindow$DecorView(FrameLayout).onMeasure(int, int) line: 293  
PhoneWindow$DecorView.onMeasure(int, int) line: 2092  
PhoneWindow$DecorView(View).measure(int, int) line: 12727 
ViewRootImpl.performTraversals() line: 1068 
ViewRootImpl.handleMessage(Message) line: 2446 
ViewRootImpl(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 137 
ActivityThread.main(String[]) line: 4424  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 511 
ZygoteInit$MethodAndArgsCaller.run() line: 784 
ZygoteInit.main(String[]) line: 551 
NativeStart.main(String[]) line: not available [native method] 

et ici la OnLayout():

@Override 
    protected void onLayout(boolean changed, int l, int t, int r, int b) { 
     super.onLayout(changed, l, t, r, b); 

     if (changed) { 

     itemGrid.getLayoutParams().width = (int) itemSize; 
     itemGrid.getLayoutParams().height = (int) itemSize; 

     itemProduction.getLayoutParams().width = (int) itemSize; 
     itemProduction.getLayoutParams().height = (int) itemSize; 

     itemConsumption.getLayoutParams().width = (int) itemSize; 
     itemConsumption.getLayoutParams().height = (int) itemSize; 

     imageViewFlowAnimation.getLayoutParams().height = (int) animationHeight; 
     imageViewFlowAnimation.getLayoutParams().width = (int) animationWidth; 
} 
    } 
+0

Pouvez-vous publier le code de vos méthodes 'onLayout()' et 'onMeasure()'? – CaseyB

+0

Ok, j'ai ajouté du code, itemGrid, itemProduction, itemConsumption et imageViewFlowAnimation sont des enfants RelativeLayout –

Répondre

1

Vous ne devriez pas appellerez super dans les deux méthodes. C'est ce qui met dans une boucle sans fin. Vous devez également vous assurer que vous appelez setMeasuredDimension(); à partir de onMeasure() ou il lèvera une exception.

+0

Si je n'appelle pas super() dans onLayout() je ne vois rien à l'écran. Notez que je charge la mise en page xml en appelant layoutInflater.inflate (R.layout.ui_synoptic, this, true); sur le créateur. Le fichier xml contient un RelativeLayout lui-même –

+0

Essayez ensuite de ne pas l'appeler dans 'onMeasure()' mais assurez-vous d'appeler 'setMeasuredDimension()'. – CaseyB

+0

J'ai changé: pas de substitution de onMeasure et seulement une ligne sur onLayout qui ajuste lay layour avec child.layout(). Même effet –

1

Avez-vous essayé ceci: si (changé) super.onLayout (changé, l, t, r, b);

+0

Utile pour vérifier le paramètre modifié. Mais j'ai remarqué que la boucle est interrompue seulement si je omets de surcharger le onMeasure(). –

+0

J'ai résolu en utilisant if (changed) {<< définir la taille childrend >>} et en mettant le super.onLayout() en dehors du bloc if. –

Questions connexes