Пересчитать ScrollView для разных представлений ViewFlipper? - PullRequest
5 голосов
/ 26 августа 2010

У меня есть ScrolLView, который оборачивает ViewFlipper. Контент в ViewFlipper не имеет одинаковую высоту, поэтому мой второй экран имеет очень длинную полосу прокрутки, которая продолжает работать с пустым содержимым:

<ScrollView android:id="@+id/outer_scroll"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:fillViewport="true">
<ViewFlipper android:id="@+id/flipper"
android:layout_width="fill_parent" android:layout_height="fill_parent">

<EditText android:id="@+id/desc" style="@style/DescriptionArea"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:enabled="false" android:focusableInTouchMode="false"
android:background="@null" />

<LinearLayout android:id="@+id/details_root"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:padding="10dp">

<TextView android:id="@+id/item_details" style="@style/DetailsLarge"
android:textColor="#000" android:visibility="gone"
android:layout_width="wrap_content" android:layout_height="fill_parent"
android:text="@string/item_details_tags" />
<TextView android:id="@+id/tags" android:layout_width="wrap_content"
android:layout_height="fill_parent" android:textColor="#000"
android:visibility="gone" />
</LinearLayout>
</ViewFlipper>
</ScrollView>

Так, например, блок EditText очень длинный, и полоса прокрутки захватывает все это. Я переключаюсь на LinearLayout, и полоса прокрутки продолжает путь мимо содержимого TextView. По сути, он мне нужен, чтобы «пересчитать» высоту вида.

Кроме того, оборачивать EditText и LinearLayout в свои собственные ScrollViews нельзя, потому что тогда виртуальная / виртуальная клавиатура блокирует содержимое EditText.

Ответы [ 2 ]

19 голосов
/ 26 августа 2010

Во время измерения ViewFlipper (а также ViewSwitcher, TextSwitcher и т. Д. - все потомки ViewAnimator) по умолчанию будут иметь размер в соответствии с самым большим дочерним элементом, включая невидимые.

Установите флаг MeasureAllChildren в false, чтобы изменить это поведение, чтобы использовать только видимого в данный момент дочернего элемента при измерении размера:

ViewFlipper flipper = (ViewFlipper)findViewById(R.id.flipper);
flipper.setMeasureAllChildren(false);
5 голосов
/ 17 января 2012

Если вы делаете свой видоискатель в xml, вы также можете использовать android: measureAllChildren = "false".

...