немає тяжкості для прокрутки. як зробити вміст всередині прокрутки як центр


104

Я хочу, щоб вміст всередині scrollView був центром.

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:layout_gravity="center" >

    <Button 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="check" 
        android:gravity="center_vertical|center_horizontal"/>

</ScrollView>

Примітка: немає android:gravityатрибута для scrollvew.

будь-який золь: -

Відповіді:


175

У мене було те саме питання і, нарешті, розібрався. Це для вертикалі ScrollView.

Помістіть ScrollViewвсередину a RelativeLayoutі покладіть його в центр RelativeLayout. Для того, щоб це працювало, ви ScrollViewповинні мати

android:layout_height="wrap_content"

Ось як повинен виглядати кінцевий код:

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

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" 
        android:layout_centerVertical="true" >

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

            <Button
                android:id="@+id/button1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b1"/>
            <Button
                android:id="@+id/button2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b2"/>
            <Button
                android:id="@+id/button3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="b3"/>
        </LinearLayout>

    </ScrollView>

</RelativeLayout>

29
Цей, здається, працює для мене краще, ніж прийнята відповідь. Дякую!
Патрік Боос

В ідеалі андроїд повинен розглянути ці проблеми, коли існує ієрархія компонування. Також слід передбачити обидва варіанти прокрутки (горизонтальні / вертикальні) в одному прокрутці. BTW дякує @hadi
mayank_droid

2
Це трохи хак, тому, хоча це працює добре, він відчуває себе неправильно.
ДарійL

3
Привіт, це працює, але не прокручується, коли клавіатура видно, я спробував додати маніфест, android:windowSoftInputMode="stateHidden|adjustResize"але, не прокручуйте, допоможіть мені будь ласка
Helio Soares Junior

3
Немає необхідності використовувати важкий режим RelativeLayoutперегляду коренів. Це може бути FrameLayoutі android:layout_gravity="center_vertical"дляScrollView
GrafOrlov

148

Як щодо цього?

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center"
        android:gravity="center">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>

2
Ага! Як щодо цього! Це спрацювало для мене фантастично, тому дуже дякую, добрий сер.
RileyE

Дивовижно! Це і мене врятувало! Дякую :)
marienke

101
У цьому є одна проблема. Якщо вміст у ScrollView більший, ніж перегляд прокрутки, він все одно відцентрує його та відріже вміст у верхній частині (ще не впевнений, чому саме). Це означає, що ви не можете прокрутити там.
Патрік Боос

7
PatrickBoos має рацію; це, здається, не працює. Використовуйте відповідь хаді нижче, вертикально центрируючи огляд прокрутки у відносному макеті.
Мейсон Лі

Так, у цьому випадку є помилка, вміст більший за scrollView, вміст не прокручуватиметься доверху, його верхнє число негативне число, дивно :(
Kross

98

Я думаю, що більш елегантне рішення було б використовувати в ScrollView«S android:fillViewportвласності. A ScrollViewдещо відрізняється тим, як він поводиться з його переглядом вмісту (може мати лише один), навіть якщо ви встановите match_parent( fill_parent) на його, ScrollViewвін не дасть такого інтервалу для його перегляду вмісту, натомість поведінка за замовчуванням призначена для ScrollViewзавершення вміст незалежно від того, що ви вказали для цього представлення даних. Що android:fillViewportозначає підказати ScrollViewрозтягнути його вміст, щоб заповнити вікно перегляду ( http://developer.android.com/reference/android/widget/ScrollView.html#attr_android:fillViewport ). Отже, у цьому випадку ваш LinearLayoutелемент буде розтягнутий, щоб відповідати вікні перегляду, і якщо висота буде відстати від вікна перегляду, то він буде прокручуватися, що саме те, що ви хочете!

Прийнята відповідь не буде працювати належним чином, коли вміст виходить за межі, ScrollViewтому що він все ще буде центром подання вмісту, спочатку змушуючи його відрізати частину перегляду, а ScrollViewцентрированний в іншому макеті працює, але просто не здається правильним, до того ж Я думаю, що це також призведе до помилки, що залишається (марний батько або щось подібне).

Спробуйте щось подібне:

<ScrollView
    android:id="@+id/scroller"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay"
    android:fillViewport="true">

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

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" />

    </LinearLayout>

</ScrollView>

Просто пам’ятайте, що причина, в якій він зараз зосереджена тут, полягає в тому, що android:gravityз того LinearLayoutчасу, коли ScrollViewбуде розтягнутий, LinearLayoutтак майте це на увазі залежно від того, що ви додали до макета.

Ще один хороший читати далі , ScrollViewхоча і нема про зосередженні , а про fillViewportє http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/


11
Це виглядає як найбільш правильна реалізація, не потрібні додаткові перегляди.
ДарійL

1
Гарне рішення, здається, найчистіше для мене. Дякую за це
Бенджамін Шарбау

2
Працює краще, ніж прийнята відповідь, ти врятував мені багато часу! Дійсно молодий Брайан Етьє!
Mattia Ruggiero

Це правильне рішення з усієї причини, описаної в ньому .. Якщо ви спробуєте рішення вище, а перегляд прокрутки ширший за ваш, ви дійсно будете мати частину свого перегляду прокрутки недоступною і не зможете прокручуватися до нього .. Це слід сприймати як правильне рішення
Speckpgh,

1
Типовий Stackoverflow .. правильне рішення часто знаходиться десь посередині.
Теовальд

14

Використовуйте цей атрибут у ScrollView

android:fillViewport="true"

Приклад

 <?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:scrollbarStyle="outsideOverlay"
android:fillViewport="true"
>
   <RelativeLayout
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

         <!--Your Code goes here-->

   </RelativeLayout>

</ScrollView>

Не забудьте використовувати одиночну дитину в ScrollView так само, як у наведеному вище прикладі, який є відносним.


@JoshuaKing може тому, що це 7 років питання, і я опублікував цю відповідь нещодавно 9 місяців тому.
Абхішек

Га! о .. правда. Ну, це спрацювало чудово! Тож дякую!
Король Джошуа

1
Це безумовно має бути прийнятою відповіддю! Він прекрасно працює і центрирует ScrollView, якщо вміст менше розміру контейнера. Працює як для ScrollView, так і для HorizontalScrollView. Дуже дякую! 💝💖
Рей Лі

це може мати небажаний ефект розтягування контенту всередині виду прокрутки
martinseal1987

@ martinseal1987 Я думаю, що ефект буде залежати від вашого дочірнього компонента, від того, як ви зробите дизайн вашого макета, хоча якщо це не працює для вас, ви можете створити свій власний компонент перегляду прокрутки відповідно до вашого дизайну та робочих потреб. і, будь ласка, також поділіться зі мною бажаним результатом скріншота, щоб я міг розглянути та запропонувати ваші кращі та ефективніші рішення. готовий допомогти. ура.
Абхішек Гарг

9

Для @Patrick_Boss - те, що зупинило вміст від різання в моїй програмі, - це змінити гравітацію та макет_гравітації на центр_горизонталь для LinearLayout.

Це працювало для мене ... але не впевнений, чи спрацює він для вас.

Модифікація відповіді @ Ghost -

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/scrollView1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingTop="12dp"
    android:paddingBottom="20dp"
    android:scrollbarStyle="outsideOverlay" >


    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" 
        android:layout_gravity="center_horizontal"
        android:gravity="center_horizontal">

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="check" 
            android:gravity="center_vertical|center_horizontal"/>
    </LinearLayout>

</ScrollView>

1
Це вирішує проблему вирізання верху. Але є ще одна проблема з цим рішенням. Вміст ScrollView не був центрований вертикально. Але це можна виправити, встановивши наступні значення ScrollView: android: layout_height = "wrap_content" android: layout_gravity = "center_vertical"
Патрік Боос

Я виявив, що для цього в інших макетах верхній ScrollView повинен бути вбудований в FrameLayout.
Тео

1

Варто враховувати, що НЕ встановлювати . Переконайтеся, що у ваших дитячих контролях, особливо в EditTextконтрольних, не встановлено RequestFocusвластивості.

Це може бути однією з останніх інтерпретованих властивостей у макеті, і вона перекриє налаштування гравітації батьків ( layoutабо ScrollView).


0

використовуючи подання прокрутки всередині ConstraintLayout. Це працює для мене

<androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@android:color/white">

            <ScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:orientation="vertical" />
            </ScrollView>
        </androidx.constraintlayout.widget.ConstraintLayout>

Висота подання прокрутки повинна бути wrap_content

<ScrollView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.