Параметры onMeasure (), предоставляемые LinearLayout

1

Я создал пользовательское представление, и я пытаюсь реализовать 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 должно быть меньше места? (Что было бы хорошо, но мне нужно знать, сколько места я могу занять...)

Любые идеи? Большое спасибо!

Теги:
user-interface

2 ответа

0
Лучший ответ

Я понял, как добиться того, чего хотел:

1.) это не ответственность View, чтобы определить, должно ли оно заполнять все свободное пространство или нет. Это делается в макете.

2.) Я могу передать все оставшееся вертикальное пространство моему виду, имея макет, например

 <MyView   
  android:layout_width="fill_parent"
  android:layout_height="0px" android:layout_weight="1"></MyView>

3.) onMeasure() должен установить измеренный размер, рассматривая режим (getMode (widthMeasurementSpec)).

1

Вы добавляете TextViews после своего пользовательского представления, поэтому их высота не будет влиять на вашу пользовательскую высоту представления.

  • 0
    Использование wrap_content бы это поведение, верно?
  • 0
    В документации сказано, что если дочерние элементы не помещаются в родительский, родительский вызов снова вызывает меня с другими аргументами, поэтому я подумал, что это не должно быть проблемой. Тем не менее, похоже, что я должен использовать layout_weight, чтобы получить то, что я хочу. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню