2013-10-07 14 views
7

Dalla documentazione ufficiale:Perché view.onLayout() viene chiamato ripetitivamente quando modificato = falso?

Android Docs - View

protected void onLayout (boolean changed, int left, int top, int right, int bottom) 

Parameters 
changed This is a new size or position for this view 
left Left position, relative to parent 
top  Top position, relative to parent 
right Right position, relative to parent 
bottom Bottom position, relative to parent 

Perché la mia visualizzazione personalizzata si chiama ripetutamente con changed=false? È normale?

Ecco l'albero chiamata:

Synoptic.onLayout(boolean, int, int, int, int) line: 130  
Synoptic(View).layout(int, int, int, int) line: 11282 
Synoptic(ViewGroup).layout(int, int, int, int) line: 4224 
RelativeLayout.onLayout(boolean, int, int, int, int) line: 925 
RelativeLayout(View).layout(int, int, int, int) line: 11282 
RelativeLayout(ViewGroup).layout(int, int, int, int) line: 4224 
LinearLayout.setChildFrame(View, int, int, int, int) line: 1628 
LinearLayout.layoutHorizontal() line: 1617 
LinearLayout.onLayout(boolean, int, int, int, int) line: 1401 
LinearLayout(View).layout(int, int, int, int) line: 11282 
LinearLayout(ViewGroup).layout(int, int, int, int) line: 4224 
SwipeView(FrameLayout).onLayout(boolean, int, int, int, int) line: 431 
SwipeView(HorizontalScrollView).onLayout(boolean, int, int, int, int) line: 1382  
SwipeView.onLayout(boolean, int, int, int, int) line: 154 
SwipeView(View).layout(int, int, int, int) line: 11282 
SwipeView(ViewGroup).layout(int, int, int, int) line: 4224 
LinearLayout.setChildFrame(View, int, int, int, int) line: 1628 
LinearLayout.layoutVertical() line: 1486  
LinearLayout.onLayout(boolean, int, int, int, int) line: 1399 
LinearLayout(View).layout(int, int, int, int) line: 11282 
LinearLayout(ViewGroup).layout(int, int, int, int) line: 4224 
FrameLayout.onLayout(boolean, int, int, int, int) line: 431 
FrameLayout(View).layout(int, int, int, int) line: 11282  
FrameLayout(ViewGroup).layout(int, int, int, int) line: 4224  
LinearLayout.setChildFrame(View, int, int, int, int) line: 1628 
LinearLayout.layoutVertical() line: 1486  
LinearLayout.onLayout(boolean, int, int, int, int) line: 1399 
LinearLayout(View).layout(int, int, int, int) line: 11282 
LinearLayout(ViewGroup).layout(int, int, int, int) line: 4224 
PhoneWindow$DecorView(FrameLayout).onLayout(boolean, int, int, int, int) line: 431 
PhoneWindow$DecorView(View).layout(int, int, int, int) line: 11282 
PhoneWindow$DecorView(ViewGroup).layout(int, int, int, int) line: 4224 
ViewRootImpl.performTraversals() line: 1514 
ViewRootImpl.handleMessage(Message) line: 2467 
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] 
+0

qualcuno sta richiedendo layout? –

+0

Il resto della mia intarface sembra essere statico (senza animazioni) ma ci sono molti layout relativi. –

risposta

6

ho trovato il problema: per un componente composto come la mia, che contiene un TextView, la chiamata ripetitiva ad .setText() provoca una chiamata al genitore onLayout()

... anche se il nuovo testo è uguale alla corrente TextView testo!

così ho risolto:

public void setTextViewText(String text) { 
    if (!this.textViewValue.getText().equals(text)) { 
     this.textViewValue.setText(text); 
    } 
} 
10

La parte chiave qui dalla documentazione è:

Chiamato dal layout quando questo punto di vista dovrebbe assegnare una dimensione e la posizione di ciascuno dei suoi figli.

Se una vista all'interno di un ViewGroup è impostata su wrap_content e cambia le sue dimensioni (ad esempio, il testo all'interno di TextView si trasforma in una stringa più lunga), si verificherà un onLayout nel ViewGroup. Questo perché le Viste hanno le loro dimensioni quando sono disposte, quindi senza la chiamata la Vista non avrà mai una nuova dimensione.

Problemi correlati