Android RelativeLayout: как выровнятьParentBottom, когда обернут в ScrollView? - PullRequest
30 голосов
/ 27 июня 2010

Проблема, с которой я столкнулся, заключается в том, что если у меня есть представление (например, myButton) внутри RelativeLayout, установленное на alignParentBottom - (согласно приведенному ниже коду), - а затем обернуть RelativeLayout скроллвью (необходимо, чтобы содержимое было быть видимым на экранах меньшего размера или при изменении ориентации на альбомную) - тогда, когда родительское дно НЕ видно (например, при изменении ориентации на альбомную), myButton отображается вверху страницы, а НЕ внизу.

Как вы можете выровнять вид внизу экрана и оставить его внизу, даже если нижняя часть находится ниже прокрутки?

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



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:id="@+id/topLayout"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent">



... lots of views and stuff


<Button android:layout_alignParentBottom="true" 
android:id="@+id/myButton"  
android:text="Click Me" />

</RelativeLayout>
</ScrollView>   

Ответы [ 5 ]

25 голосов
/ 22 апреля 2014

Возьмите кнопку из SCrollview, оберните Scrollview и кнопку в линейный макет, установите высоту scrollview равной 0dip и установите ее вес равным 1, не устанавливайте какое-либо свойство веса для кнопки, поэтому представление прокрутки можетзанимают все оставшееся пространство, сохраняя только пространство кнопки внизу.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ScrollView 
        android:layout_width="match_parent"
        android:layout_height="0dip"
        android:layout_weight="1">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

        ....lots of views...


        </LinearLayout>
    </ScrollView>

    <Button
        android:id="@+id/button1"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="Button" />

</LinearLayout>
7 голосов
/ 27 июня 2010

Использование fill_parent в качестве высоты дочернего элемента ScrollView не имеет смысла.Вы говорите, что RelativeLayout всегда должен быть таким же высоким, как и его родитель.В этом случае ScrollView становится бесполезным!Высота RelativeLayout должна быть установлена ​​равной wrap_content, и в этом случае, в зависимости от того, что содержит RelativeLayout, alignParentBottom может работать не так, как вы ожидаете.Вы должны просто использовать LinearLayout, это будет намного проще.

3 голосов
/ 14 февраля 2011

ну, вы можете попробовать это

<LinearLayout android:id="@+id/parentLayout"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ScrollView android:id="@+id/mainScrollView"
        android:layout_width="fill_parent" android:layout_height="fill_parent"
        android:layout_weight="1" xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillViewport="true">



        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/topLayout" android:layout_width="fill_parent"
            android:layout_height="fill_parent">



            ... lots of views and stuff


            <Button android:layout_alignParentBottom="true" android:id="@+id/myButton"
                android:text="Click Me" />

        </RelativeLayout>
    </ScrollView>
</LinearLayout>
0 голосов
/ 15 февраля 2019

Ни одно из этих решений не удовлетворило меня, поэтому я опубликую свое собственное решение.

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <!-- lots of stuff -->

        <Space
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</ScrollView>

Небольшое объяснение: когда много места (например, в портретном изображении), пространство заполняет это пространство и нажимает кнопку внизЕсли пробела нет (например, в альбомной ориентации), в пространстве будет 0 высот, а кнопка будет находиться непосредственно под содержимым.

0 голосов
/ 27 июля 2016

Уже немного поздно, но самое простое решение - добавить

android:below="@id/lots_of_stuffs"

Вот так:

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

   <RelativeLayout
     android:id="@+id/topLayout"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent">


     <LinearLayout
       android:id="@+id/lots_of_stuffs" >

       ... lots of views and stuff

     </LinearLayout>

    <Button android:layout_alignParentBottom="true" 
      android:id="@+id/myButton"  
      android:text="Click Me"
      android:below="@id/lots_of_stuffs" /> <!-- Here is the "hack" -->

   </RelativeLayout>
</ScrollView>  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...