Почему 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 для действия, а не в классе пользовательских представлений.

Это может сработать, но без гарантий. Обычно требуется некоторое время и понимание жизненного цикла андроида.

Другие вопросы по тегам