web-dev-qa-db-fra.com

Ajout d'une vue au bas de la disposition dans une vue à défilement

Donc, ma mise en page ressemble à ceci:

<ScrollView>
    <RelativeLayout>
        <BunchOfViews/>
        <ImageView Android:layout_alignParentBottom="true"/>
    </RelativeLayout>
</ScrollView>

J'ai la ScrollView afin que toute la mise en page soit toujours visible quelle que soit la hauteur de l'écran. Le problème est que sur un écran très élevé, je veux toujours que ma ImageView soit en bas. Cependant, un enfant de ScrollView ne semble pas avoir un fond défini. La View est placée en haut de la mise en page. Comment puis-je résoudre ce problème d'une manière ordonnée?

58
pgsandstrom

J'ai rencontré le même problème. Je n'ai jamais pu trouver une solution très agréable, mais voici comment je l'ai fait. Peut-être que quelqu'un d'autre a un meilleur moyen, je déteste ajouter des mises en page qui ne font rien.

Mon bidouillage consistait à ajouter une représentation linéaire factice au bas de la vue de défilement avec fill_parent pour occuper toute la pièce et forcer la vue de défilement à remplir l'écran. Ajoutez ensuite le composant de votre choix à cette application linéaire.

Voici une de mes mises en page qui fait ceci:

<ScrollView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:layout_weight="1"
    Android:fillViewport="true" >

    <RelativeLayout
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_marginTop="15px" >

        <!-- bunch of components here -->

        <LinearLayout
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:layout_below="@+id/spinner"
            Android:layout_marginTop="5px"
            Android:gravity="center_horizontal|bottom"
            Android:paddingTop="2px" >

            <Button
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:paddingLeft="20px"
                Android:paddingRight="20px"
                Android:text="Delete" />
        </LinearLayout>
    </RelativeLayout>
</ScrollView>
134
dweebo

J'ai eu le même problème et j'ai trouvé cette page:

http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

En gros, vous définissez le Android:fillViewport du ScrollView sur true, ce qui permettra à la vue enfant de se développer à la même hauteur que le ScrollView lui-même, en remplissant l'espace. Il vous suffit ensuite de placer l'un des contrôles enfants layout_height sur fill_parent et layout_weight sur 1, ce qui provoque le "ressort" de ce contrôle pour remplir l'espace vide.

Notez que si le contenu de ScrollView est déjà suffisamment grand pour remplir ScrollView, le Android:fillViewport n'a aucun effet, le paramètre ne prend effet que lorsque nécessaire.

Mon XML final ressemble à ceci:

<ScrollView
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:fillViewport="true">
    <LinearLayout
        Android:orientation="vertical"
        Android:layout_height="wrap_content">
        <LinearLayout
            Android:layout_height="fill_parent"
            Android:layout_weight="1">
            <!-- this expands to fill the empty space if needed -->
        </LinearLayout>

        <!-- this sits at the bottom of the ScrollView,
        getting pushed out of view if the ScrollView's
        content is tall enough -->
        <ImageView
            Android:layout_height="wrap_content"
            Android:src="@drawable/footer_image">
        </ImageView>
    </LinearLayout>
</ScrollView>
64
Joel Malone

il semble que la linéarité ne soit pas nécessaire, tout ce qui compte est le fillViewPort .. 

    <Button
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignBottomParent="true">

maintenant que vous avez spécifié que le délai relatif doit être au moins égal à la taille de l’écran.

20
Laurent

son travail pour moi parfaitement Android: fillViewport = "true"

12
Shohel Rana

La réponse de Joel Malone L'ajout d'une vue au bas de la disposition dans une vue à défilement fait ce tour. Ma solution est presque la même, sauf que j'utilise le widget Space pour effectuer le travail de remplissage de la hauteur restante à l'intérieur de la présentation parent. Comme ça:

<ScrollView
    Android:layout_width="match_parent"
    Android:layout_height="match_parent
    Android:fillViewport="true"
    >
    <LinearLayout
        Android:orientation="vertical"
        Android:layout_height="wrap_content"
        >
        <Android.support.v4.widget.Space
            Android:layout_height="match_parent"
            Android:layout_weight="1"
            />
    <ImageView
        Android:layout_height="wrap_content"
        Android:src="@drawable/footer_image"
        />
    </LinearLayout>
</ScrollView>

Attention:

  • fill_parent dans les autres réponses est noté comme obsolète depuis longtemps;
  • Comparez à une LinearLayout vide pour remplir le reste de la mise en page parente, je pense que Space est beaucoup plus approprié (il est conçu pour faire ce travail.)
  • Enfin, n'oubliez pas cet attribut important au début de ScrollView: Android:fillViewport="true". Ensemble, ils font ce tour.
6
Anthonyeef

Sur votre vue que vous voulez être au bas utilisez Android: gravity = "bottom"

1
hitch45

De: http://code.google.com/p/k9mail/source/browse/k9mail/trunk/res/layout/account_setup_basics.xml?r=1314

Cela devrait vous aider:

<RelativeLayout
        Android:layout_marginTop="-45dip" 
        Android:padding="0dip"
        Android:layout_alignParentBottom="true"
        Android:gravity="bottom|right" 
        Android:background="@Android:drawable/bottom_bar"
        Android:layout_height="fill_parent"
        Android:layout_width="fill_parent">
        <Button
            Android:id="@+id/manual_setup"
            Android:text="@string/account_setup_basics_manual_setup_action"
            Android:minWidth="@dimen/button_minWidth"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:layout_marginBottom="-4dip" 
            Android:layout_alignParentLeft="true"
            Android:layout_centerVertical="false" 
            />
        <Button
            Android:id="@+id/next"
            Android:text="@string/next_action"
            Android:minWidth="@dimen/button_minWidth"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:drawableRight="@drawable/button_indicator_next"
            Android:layout_marginBottom="-4dip" 
            Android:layout_alignParentRight="true"
            Android:layout_centerVertical="false" 
            />
    </RelativeLayout>
0
Pentium10
ScrollView view = new ScrollView( this );
ScrollView.LayoutParams lps = new FrameLayout.LayoutParams( FILL_PARENT, FILL_PARENT, Gravity.CENTER );
LinearLayout layout = new LinearLayout( this );
// what ever you want in the Layout 
view.addView( layout, lps );
0
Shibly