Зачем смотреть.onLayout () вызывается повторно при изменении=false?
из официальных документов:
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
почему мой пользовательский вид вызывается повторяющимся образом с changed=false
? Это нормально?
вот дерево вызовов:
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]
2 ответов
ключевая часть здесь из документов:
позвонили из макета, когда этот вид следует назначить размер и положение каждому из своих детей.
Если представление внутри ViewGroup установлено в wrap_content и оно изменяет свой размер (например, текст внутри TextView изменяется на более длинную строку), то произойдет onLayout в ViewGroup. Это связано с тем, что представлениям задается их размер, когда они выложены, поэтому без вызова представление никогда не будет дано новое размер.
я нашел проблему: для составного компонента, такого как мой, который содержит TextView
, повторяющийся вызов .setText()
вызывает родителей onLayout()
...даже если новый текст равен текущему TextView
текст!
поэтому я решил:
public void setTextViewText(String text) {
if (!this.textViewValue.getText().equals(text)) {
this.textViewValue.setText(text);
}
}