Я создал пользовательское представление, и я пытаюсь реализовать onMeasure(), чтобы хорошо работать во всех ситуациях. В настоящее время я задаюсь вопросом о параметрах, которые передаются как width/heightMeasurementSpec, когда мое представление помещается в линейный макет, например:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<MyView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/someId"></MyView>
</LinearLayout>
В этом случае после выполнения
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int height = MeasureSpec.getSize(heightMeasureSpec);
int heightmode = MeasureSpec.getMode(heightMeasureSpec);
//...
}
У меня высота = 271 (на экране 480x320) и heightmode = AT_MOST, которая, кажется, имеет смысл.
Но когда я добавляю некоторые текстовые элементы, подобные этому после моего представления:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<MyView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/someId"></MyView>
<TextView android:text="1" android:layout_width="fill_parent"
android:layout_height="wrap_content"></TextView>
<TextView android:text="2" android:layout_width="fill_parent"
android:layout_height="wrap_content"></TextView>
</LinearLayout>
Я все равно получаю одинаковые значения height/heightmode (onMeasure фактически вызывается дважды, но с теми же аргументами). Я думал, что, поскольку TextViews потребляют некоторое пространство, для MyView должно быть меньше места? (Что было бы хорошо, но мне нужно знать, сколько места я могу занять...)
Любые идеи? Большое спасибо!
Я понял, как добиться того, чего хотел:
1.) это не ответственность View, чтобы определить, должно ли оно заполнять все свободное пространство или нет. Это делается в макете.
2.) Я могу передать все оставшееся вертикальное пространство моему виду, имея макет, например
<MyView
android:layout_width="fill_parent"
android:layout_height="0px" android:layout_weight="1"></MyView>
3.) onMeasure() должен установить измеренный размер, рассматривая режим (getMode (widthMeasurementSpec)).
Вы добавляете TextViews после своего пользовательского представления, поэтому их высота не будет влиять на вашу пользовательскую высоту представления.
wrap_content
бы это поведение, верно?