Добавление вида в нижней части макета внутри scrollview
так что мой макет выглядит в основном так:
<ScrollView>
<RelativeLayout>
<BunchOfViews/>
<ImageView android:layout_alignParentBottom="true"/>
</RelativeLayout>
</ScrollView>
у меня есть ScrollView
таким образом, все макет всегда виден независимо от высоты экрана. Проблема в том, что на очень высоком экране, я все еще хочу мой ImageView
быть внизу. Тем не менее, ребенок ScrollView
похоже, у вас нет определенного дна. Элемент View
находится в верхней части макета. Как я могу решить эту проблему аккуратным способом?
8 ответов:
я столкнулся с такой же проблемой. Я никогда не мог найти очень хорошее решение, но вот как я это сделал. Может быть, у кого-то есть лучший способ, я ненавижу добавлять макеты, которые ничего не делают.
мой Хак должен был добавить фиктивный linearlayout в нижней части scrollview, который имеет fill_parent, чтобы занять всю комнату и заставить scrollview заполнить экран. Затем добавьте любой компонент, который я хочу, чтобы это linearlayout.
вот один из моих макетов, который делает это:
<ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:fillViewport="true" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_marginTop="15px" > <!-- bunch of components here --> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_below="@+id/spinner" android:layout_marginTop="5px" android:gravity="center_horizontal|bottom" android:paddingTop="2px" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="20px" android:paddingRight="20px" android:text="Delete" /> </LinearLayout> </RelativeLayout> </ScrollView>
у меня была та же проблема, и я нашел эту страницу:
http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/
в основном, вы устанавливаете ScrollView в
android:fillViewport
к true, что позволит дочернему виду расширяться до той же высоты, что и сам ScrollView, заполняя пространство. Затем вам просто нужно иметь один из дочерних элементов управления"layout_height
значениеfill_parent
иlayout_weight
до1
, заставляя этот элемент управления "пружинить", чтобы заполнить пустую пространство.обратите внимание, что если содержимое ScrollView уже достаточно высоко, чтобы заполнить ScrollView, то
android:fillViewport
не имеет никакого эффекта, поэтому установка срабатывает только при необходимости.мой окончательный XML выглядит примерно так:
<ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true"> <LinearLayout android:orientation="vertical" android:layout_height="wrap_content"> <LinearLayout android:layout_height="fill_parent" android:layout_weight="1"> <!-- this expands to fill the empty space if needed --> </LinearLayout> <!-- this sits at the bottom of the ScrollView, getting pushed out of view if the ScrollView's content is tall enough --> <ImageView android:layout_height="wrap_content" android:src="@drawable/footer_image"> </ImageView> </LinearLayout> </ScrollView>
Кажется, что linearlayout не нужен, все, что важно-это fillViewPort. вы могли бы просто использовать
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignBottomParent="true">
теперь, когда вы указали relativelayout, чтобы быть по крайней мере размер экрана.
ответ Джоэла Мэлоуна добавление вида в нижней части макета внутри scrollview это трюк. Мое решение почти то же самое, за исключением того, что я использую
Space
виджет для выполнения работы по заполнению остальной высоты внутри родительского макета. Вот так:<ScrollView android:layout_width="match_parent" android:layout_height="match_parent android:fillViewport="true" > <LinearLayout android:orientation="vertical" android:layout_height="wrap_content" > <android.support.v4.widget.Space android:layout_height="match_parent" android:layout_weight="1" /> <ImageView android:layout_height="wrap_content" android:src="@drawable/footer_image" /> </LinearLayout> </ScrollView>
внимание:
fill_parent
в других ответах отмечается как устаревший в течение длительного времени;- сравнить с пустой
LinearLayout
чтобы заполнить остальную часть родительского макета, я думаюSpace
гораздо более уместно(он предназначен для выполнения этой работы.)- наконец, не забывайте, что важный атрибут в начале
ScrollView
:android:fillViewport="true"
. Они вместе делают этот трюк.
Это должно помочь вам:
<RelativeLayout android:layout_marginTop="-45dip" android:padding="0dip" android:layout_alignParentBottom="true" android:gravity="bottom|right" android:background="@android:drawable/bottom_bar" android:layout_height="fill_parent" android:layout_width="fill_parent"> <Button android:id="@+id/manual_setup" android:text="@string/account_setup_basics_manual_setup_action" android:minWidth="@dimen/button_minWidth" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_marginBottom="-4dip" android:layout_alignParentLeft="true" android:layout_centerVertical="false" /> <Button android:id="@+id/next" android:text="@string/next_action" android:minWidth="@dimen/button_minWidth" android:layout_height="wrap_content" android:layout_width="wrap_content" android:drawableRight="@drawable/button_indicator_next" android:layout_marginBottom="-4dip" android:layout_alignParentRight="true" android:layout_centerVertical="false" /> </RelativeLayout>