Добавление вида в конец макета внутри прокрутки - PullRequest
63 голосов
/ 10 марта 2010

Так что мой макет выглядит в основном так:

<ScrollView>
    <RelativeLayout>
        <BunchOfViews/>
        <ImageView android:layout_alignParentBottom="true"/>
    </RelativeLayout>
</ScrollView>

У меня есть ScrollView, поэтому все макеты всегда видны независимо от высоты экрана. Проблема в том, что на очень высоком экране я все еще хочу, чтобы мой ImageView был внизу. Однако у ребенка ScrollView, похоже, нет определенного дна. View находится в верхней части макета. Как я могу решить эту проблему аккуратно?

Ответы [ 8 ]

140 голосов
/ 10 марта 2010

Я столкнулся с той же проблемой.Я никогда не мог найти очень приятное решение, но вот как я это сделал.Может быть, у кого-то есть лучший способ, я ненавижу добавлять макеты, которые ничего не делают.

Мой взлом был добавить фиктивную линейную планировку в нижней части скролл-просмотра, у которой есть fill_parent, чтобы занять всю комнату и заставитьпрокрутка, чтобы заполнить экран.Затем добавьте любой компонент, который я хочу, к этому 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>
68 голосов
/ 23 ноября 2010

У меня была такая же проблема, и я нашел эту страницу:

http://www.curious -creature.org / 2010/08/15 / scrollviews-удобно-трик /

По сути, вы устанавливаете 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>
20 голосов
/ 17 июня 2010

кажется, что линейное расположение не является необходимым, все, что важно, это fillViewPort. Вы можете просто использовать

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottomParent="true">

Теперь, когда вы указали относительное расположение, по крайней мере, размер экрана.

13 голосов
/ 10 февраля 2017

у меня это прекрасно работает android: fillViewport = "true"

8 голосов
/ 13 декабря 2016

ответ Джоэла Мэлоуна Добавление этого вида к нижней части макета внутри прокрутки делает этот трюк.Мое решение почти такое же, за исключением того, что я использую виджет 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".Они вместе делают этот трюк.
1 голос
/ 25 мая 2014

На ваш взгляд, что вы хотите быть внизу, используйте android: gravity = "bottom"

0 голосов
/ 04 октября 2011
ScrollView view = new ScrollView( this );
ScrollView.LayoutParams lps = new FrameLayout.LayoutParams( FILL_PARENT, FILL_PARENT, Gravity.CENTER );
LinearLayout layout = new LinearLayout( this );
// what ever you want in the Layout 
view.addView( layout, lps );
0 голосов
/ 10 марта 2010

От: http://code.google.com/p/k9mail/source/browse/k9mail/trunk/res/layout/account_setup_basics.xml?r=1314

Это должно помочь вам:

<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>
...