Почему onMeasure() вызывается дважды в моем пользовательском представлении?
Ниже мой код для моего обычая View
:
XML-макет:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res/com.project.summary"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/BgColor">
<com.project.summary.customview.CustomView
android:id="@+id/customView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:colorValue="@color/textRed"
app:textString="This the Custom View!!!"
app:textSize="20sp"
/>
</LinearLayout>
Код в моем CustomView.java
:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Log.e("140117", "onMeasure()"+this.getHeight()+"||"+this.getWidth());
}
Код тестовой деятельности:
public class CustomViewActivity extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.customview_layout);
}
}
выход logcat:
01-17 13:47:01.203: E/140117(11467): onMeasure()0||0 01-17 13:47:01.243: E/140117(11467): onMeasure()28||212
Я искал Stackru, но никто не дал четкого ответа. Может ли кто-нибудь помочь мне?
3 ответа
Родительское представление может вызывать measure() более одного раза для своих дочерних элементов. Например, родитель может измерить каждого ребенка один раз с неопределенными измерениями, чтобы выяснить, насколько большим они хотят быть, а затем снова вызвать measure() для них с фактическими числами, если сумма всех неограниченных размеров детей слишком велика или слишком мала (то есть, если дети не согласны между собой относительно того, сколько места они получают, родитель вмешается и установит правила для второго прохода). как говорит https://developer.android.com/guide/topics/ui/how-android-draws.html.
Вы что-то упустили в своем вопросе? Потому что, если вы переопределите onMeasure, вы должны вызвать setMeasuredDimension(int, int), иначе вы получите исключение IllegalStateException. В вашем вопросе вы, похоже, не получите никаких исключений.
В прошлом, когда у меня были проблемы, подобные этому, и это было потому, что мой код "onAnAction" должен был быть внутри кода класса действия AKA в onCreate для действия, а не в классе пользовательских представлений.
Это может сработать, но без гарантий. Обычно требуется некоторое время и понимание жизненного цикла андроида.