Нет силы тяжести для scrollview. как сделать контент внутри 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: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 для прокрутки.

любое сол: -

Ответ 1

У меня была такая же проблема и, наконец, разобрался. Это для вертикали 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>

Ответ 2

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

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

Ответ 3

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

Ответ 4

Для @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>

Ответ 5

Используйте этот атрибут в 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>

Убедитесь, что вы используете Single Child в ScrollView, как в примере выше, который является Relativelayout.

Ответ 6

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

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