ScrollView добавляет большое пространство внизу


В моей основной деятельности есть несколько кнопок, которые помещаются друг под другом на большом экране планшета, но не на меньшем экране телефона. Я добавил ScrollView, чтобы пользователь мог прокручивать вниз до других кнопок, если этого требует размер экрана:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:orientation="vertical"
          android:background="@drawable/bg"
          android:gravity="center_horizontal">

    <TextView
        android:id="@+id/trackSelectorText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"/>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

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

        <Button                    
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="foo" />
        <!-- More buttons -->
        </LinearLayout>
    </ScrollView>
</LinearLayout>

Это работает, однако у меня есть большое пустое пространство под последней кнопкой (т. е. ScrollView может прокручиваться слишком далеко). Как на самом планшете, так и на эмуляторе с конфигурацией телефона. Если I center внутренний LinearLayout (вместо center_horizontal) пространство равномерно распределено между верхом и низом, чего я тоже не хочу. Как исправить этот макет?

Я надеюсь, что это изображение делает его более ясным, представьте, что ScrollView был полностью прокручен вниз и показывает последние кнопки. Пустое место, которое я имею в виду, находится ниже кнопки 6 на правом изображении:

Введите описание изображения здесь

4 6

4 ответа:

На самом деле, это не было связано с макетом (если только я чего-то не упустил). Я попытался прокомментировать фон, приписываемый, и это внезапно сработало. Фоновое изображение (@drawable/bg) было просто слишком большим и вызывало прокрутку. Я преобразовал фон в изображение с 9 патчами, чтобы его можно было масштабировать автоматически, и вуаля, дополнительное пространство исчезло. Тем не менее, если бы это было достижимо без 9-patch, мне все равно было бы интересно услышать, можно ли это сделать в XML-файле.

Попробуйте добавить этот атрибут в элемент ScrollView. android: fillViewport= "true"

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:fillViewport="true" > ... </ScrollVIew>

Ref: ScrollView Ref

Я проверил свой код..Отлично работают:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:background="@drawable/bg"
      android:gravity="center_horizontal">

<TextView
    android:id="@+id/trackSelectorText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"/>

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center">

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

    <Button                    
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="foo" />
    <!-- More buttons -->
    </LinearLayout>
  </ScrollView>
</LinearLayout>

Может быть, поможет вам.......!!

Вы можете использовать этот атрибут в scrollview, чтобы избежать дополнительного заполнения в нижней части вида

android:overScrollMode="never"