нет гравитации для прокрутки. как сделать контент внутри scrollview как центр - PullRequest
95 голосов
/ 24 января 2012

Я хочу содержимое внутри 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.

любой золь: -

Ответы [ 6 ]

161 голосов
/ 06 октября 2012

У меня была такая же проблема, и я наконец понял.Это для вертикали ScrollView.

Поместите ваш ScrollView в 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="wrap_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>
142 голосов
/ 24 января 2012

Как насчет этого?

<?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>
87 голосов
/ 21 января 2014

Я думаю, что более элегантным решением было бы использование свойства ScrollView android:fillViewport. 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 с центром в другом макете работает но просто не чувствую себя хорошо, к тому же я думаю, что это также приведет к ошибке lint (бесполезный родитель или что-то в этом роде).

Попробуйте что-то вроде этого:

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

9 голосов
/ 24 апреля 2018

Используйте этот атрибут в 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 используется единственный ребеноккак в примере выше, который является Relativelayout.

9 голосов
/ 02 ноября 2013

Для @Patrick_Boss - что мешало вырезать содержимое в моем приложении, это изменить гравитацию и layout_gravity на center_horizontal для 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 голос
/ 10 сентября 2013

Необходимо учитывать , что НЕ устанавливать .Убедитесь, что ваши дочерние элементы управления, особенно EditText элементы управления, не имеют свойства RequestFocus.

Это может быть одно из последних интерпретируемых свойств макета, и оно будет отменять настройки гравитации для своих родителей (layout или ScrollView).

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