web-dev-qa-db-fra.com

pas de gravité pour scrollview. comment faire du contenu dans scrollview en tant que centre

Je veux le contenu à l'intérieur du scrollView en tant que centre.

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

Note: il n'y a pas de Android:gravity attribut pour scrollvew.

n'importe quel sol: -

98
Padma Kumar

J'ai eu le même problème et finalement compris. Ceci est pour une verticale ScrollView.

Placez votre ScrollView dans un RelativeLayout et centrez-le dans le RelativeLayout. Pour que cela fonctionne, votre ScrollView devrait avoir

Android:layout_height="wrap_content"

Voici à quoi devrait ressembler le code final:

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

Que dis-tu de ça?

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

Je pense qu’une solution plus élégante consisterait à utiliser le ScrollView de Android:fillViewport propriété. Un ScrollView est un peu différent dans la façon dont il traite sa vue de contenu (ne peut en avoir qu'un), même si vous définissez match_parent (fill_parent) sur le ScrollView il ne donnera pas autant d’espacement à sa vue de contenu, mais le comportement par défaut est que ScrollView enveloppe le contenu indépendamment de ce que vous spécifiez pour cette vue. Quoi Android:fillViewport _ dit au ScrollView d’étirer son contenu pour remplir la fenêtre d’affichage ( http://developer.Android.com/reference/Android/widget/ScrollView.html#attr_Android:fillViewport ) Donc, dans ce cas, votre LinearLayout sera étiré pour correspondre à la fenêtre d'affichage et si la hauteur passe derrière la fenêtre d'affichage, il sera alors possible de faire défiler ce qui est exactement ce que vous voulez!

La réponse acceptée ne fonctionnera pas correctement lorsque le contenu s'étend au-delà de ScrollView, car il restera d'abord centré sur la vue du contenu, ce qui la coupera en partie, et le ScrollView centré dans une autre disposition fonctionne mais ne se sent pas bien, à part cela, je pense que cela entraînera également une erreur de peluche (parent inutile ou quelque chose du genre).

Essayez quelque chose comme ça:

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

Rappelez-vous simplement que la raison pour laquelle il est centré ici à cause de la Android:gravity sur le LinearLayout puisque le ScrollView étendra le LinearLayout, gardez cela à l'esprit en fonction de ce que vous ajoutez à la mise en page.

Une autre bonne lecture sur ScrollView bien que pas sur le centrage mais sur fillViewport soit http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick /

89
Brian Ethier

Pour @Patrick_Boss - ce qui a empêché le contenu de couper dans mon application était de changer la gravité et layout_gravity en center_horizontal pour LinearLayout.

Cela a fonctionné pour moi ... mais je ne sais pas si cela fonctionnera pour vous.

Modification de la réponse de @ 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>
9
ProgDevCode

tilisez cet attribut dans ScrollView

Android:fillViewport="true"

Exemple

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

Veillez à utiliser Single Child dans ScrollView, comme dans l'exemple ci-dessus, qui est Relativelayout.

9
Abhishek Garg

Une chose à considérer est que ne pas définir. Assurez-vous que vos contrôles enfants, en particulier EditText, ne pas ont la propriété RequestFocus.

Ce peut être l’une des dernières propriétés interprétées de la mise en page et il sera remplacera les paramètres de gravité sur ses parents (layout ou ScrollView).

1
Epsilon3