ScrollView вообще не прокручивается

Я не могу заставить ScrollView правильно прокручиваться. Он всегда обрезал содержимое внизу, как если бы это был обычный LinearLayout.

Мой код

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true" >

    <LinearLayout android:id="@+id/scroll_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:isScrollContainer="true"
        android:orientation="vertical" >

Конечно, я уже пробовал добавлять/удалять свойства fillViewport и isScrollContainer, и это вообще ничего не меняло.

Это для ScrollView (ТОЛЬКО ВЕРТИКАЛЬНО)

HorizontalScrollView должен использоваться для горизонтальной прокрутки.


person thomaus    schedule 11.02.2013    source источник
comment
не могли бы вы вставить полный xml, возможно, это связано с вашим LinearLayout.   -  person PaNaVTEC    schedule 11.02.2013
comment
Попробуйте изменить android:layout_height="match_parent" на android:layout_height="0dp" и добавить android:layout_weight = "1" к ScrollView.   -  person Siddharth Lele    schedule 11.02.2013
comment
Только что попробовал и не повезло.   -  person thomaus    schedule 11.02.2013
comment
Для пользователей макета ограничения см. этот ссылка   -  person Reejesh PK    schedule 10.01.2019
comment
Как предложил @SiddharthLele, установка layout_height на 0dp помогла мне.   -  person ValYouW    schedule 29.01.2020
comment
Я преобразовал свой ConstraintLayout в LinearLayout, добавив поля, и я думаю, что это вызвало проблему. Я просто перетащил новый вид прокрутки и переместил в него все, исправив свою проблему.   -  person thesamoanppprogrammer    schedule 24.06.2020


Ответы (12)


Ответ: ScrollView не работает при использовании в качестве корневого элемента макета XML. Он должен быть обернут внутри LinearLayout.

Тогда решение:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ScrollView android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true" >

        <LinearLayout android:id="@+id/scroll_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

        </LinearLayout>
    </ScrollView>
</LinearLayout>
person thomaus    schedule 11.02.2013
comment
Спасибо! Как бы глупо это ни было с Android, я бы никогда не понял, что это тоже может быть одной из причин -_- - person Aman Alam; 02.12.2016
comment
Также необходимо обновить scrollView layout_height до wrap_content - person Maxwell; 15.08.2017
comment
Это неправда, что вы не можете использовать ScrollView в качестве корневого элемента, вы можете использовать ScrollView в качестве корневого элемента XML, нет проблем с его использованием в качестве корневого элемента. - person Haritsinh Gohil; 07.10.2019

Scroll View as Parent не имеет проблем. Я столкнулся с такой проблемой, когда мы добавляем отступы/поля к прямому дочернему элементу прокрутки. Держите дочерний элемент scrollview только со свойствами высоты и ширины, и он будет работать нормально.

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:animateLayoutChanges="true"
        android:fillViewport="true">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:animateLayoutChanges="true"
            android:orientation="vertical">
</LinearLayout>
</ScrollView>
person Varun Chandran    schedule 31.10.2018
comment
OMG Я боролся с этим уже как час. Это золото. - person Koppa Péter; 13.08.2019
comment
Работал и для меня! Спасибо! - person Wulf; 26.05.2020

❌Перепробовал все вышеупомянутые ответы, но моя проблема так и не была решена. И после некоторой отладки и изменений моя проблема была исправлена, так как ScrollView прокручивается.

  • Нам не нужно добавлять какой-либо родительский элемент в ScrollView, чтобы он прокручивался (как упоминалось в некоторых других ответах здесь).

✔️Исправление предназначено для моей проблемы✔️

  • изменил высоту ScrollView на 0dp

    андроид: layout_height = 0dp

  • Ограничил верх и низ родительскими/соответствующими представлениями/элементами

    приложение: layout_constraintTop_toBottomOf=@+id/imageView4 приложение:layout_constraintBottom_toBottomOf=parent

Окончательный XML-файл выглядит следующим образом

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:layout_constraintTop_toBottomOf="@+id/imageView4"
    app:layout_constraintBottom_toBottomOf="parent">

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

           <!-- Loong content -->

    </LinearLayout>
</ScrollView>
person Sarang M K    schedule 04.01.2021
comment
ключевым моментом является добавление нижнего ограничения - person Eren Tüfekçi; 25.05.2021

Выбранный ответ НЕ ВЕРЕН!

Вы МОЖЕТЕ использовать ScrollView в качестве корневого представления, оно не работает для вас, потому что вам не хватает заполнения.

Добавьте что-то вроде:

android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
person Gutimore    schedule 24.01.2018
comment
Как узнать, сколько прокладки будет достаточно? Я имею в виду, поскольку все устройства разные, не вызовет ли это проблем? - person Abdul Rahman Shamair; 02.10.2019

удалите android:isScrollContainer в LinearLayout. Согласно документации android:isScrollContainer используется для установки прокручиваемого представления. Я надеюсь, что это поможет вам. Перейдите по этой ссылке для определения.

person TNR    schedule 11.02.2013
comment
Спасибо. Спасибо. Спасибо. - person portsample; 16.06.2021

Android Studio добавляет NestedScrollView в файл активности некоторых своих шаблонов (например, Master-Detail). Наличие ScrollView в файле фрагмента и еще одного в файле активности этого фрагмента препятствует работе представления прокрутки. Удаление ScrollView в моем файле фрагмента и оставление одного в файле активности решило проблему для меня.

person Ocean    schedule 10.10.2015

Попробуйте это решение, просто отложите прокрутку, используя метод задержки публикации.

фрагмент_тест.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rootRelativeLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:fresco="http://schemas.android.com/apk/res-auto">

    <ScrollView
        android:id="@+id/scrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="40dp"
        android:fillViewport="true"
        android:scrollbars="none">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            ...
        </RelativeLayout>

    </ScrollView>

</RelativeLayout>

TestFragment.java

...
private ScrollView mScrollView;
...
mScrollView = (ScrollView) mView.findViewById(R.id.scrollView);
mScrollView.setSmoothScrollingEnabled(true);
...
new Handler().postDelayed(new Runnable() {
    @Override
     public void run() {
         if(isAdded()) {
             // Scroll 1000px down
             mScrollView.smoothScrollTo(0, 1000);
         }
     }
}, 150);

Это сработало для меня, надеюсь, это поможет.

person Ashwin    schedule 09.06.2017

Попробуй это,

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:fillViewport="true" >

<LinearLayout android:id="@+id/scroll_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >
person Mayur Dabhi    schedule 27.04.2019

Это устранило мою проблему: я добавил android:isScrollContainer="true" в LinearLayout и удалил ScrollView Code Before:

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<ScrollView
    android:id="@+id/scrollViewRecords"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true">

    <LinearLayout
        android:id="@+id/sheepList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

    </LinearLayout>
</ScrollView>
</LinearLayout>

Код после

    <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:isScrollContainer="true">

    <LinearLayout
        android:id="@+id/sheepList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

    </LinearLayout>
</LinearLayout>
person Angoranator777    schedule 14.07.2017

Есть ли способ закрыть этот вопрос? он устарел, и в настоящее время ответ, помеченный как действительный, не имеет смысла. Единственная действительная вещь, касающаяся ScrollView прямо сейчас, это:

Группа представлений, позволяющая прокручивать размещенную в ней иерархию представлений. Представление прокрутки может иметь только одного прямого дочернего элемента. Чтобы добавить несколько представлений в представление прокрутки, сделайте непосредственно дочерним элементом добавляемую группу представлений, например LinearLayout, и поместите дополнительные представления в этот LinearLayout. Никогда не добавляйте RecyclerView или ListView в представление прокрутки. Это приводит к снижению производительности пользовательского интерфейса и плохому взаимодействию с пользователем.

Взято из официальной документации: https://developer.android.com/reference/android/widget/ScrollView.html

person Carlos Daniel    schedule 26.09.2017

Я, наконец, понял, что у меня ушло буквально 5 часов на создание всего шаг за шагом и тестирование каждого шага за раз, тьфу ....

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

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

person Jani    schedule 24.08.2018

person    schedule
comment
Не добавляйте поля и отступы в макетах. - person codeByBunny; 28.09.2020
comment
Принятый ответ уже отвечает на вопрос. Также следует добавить закрывающий тег xml — это может быть ошибочно принято за 2 макета внутри родительского макета. Также добавьте к нему описание. - person Haider Malik; 29.09.2020