web-dev-qa-db-fra.com

LinearLayout n'étend pas à l'intérieur d'un ScrollView

J'ai un LinearLayout à l'intérieur d'un ScrollView qui a Android:layout_height="fill_parent", mais il ne s'étend pas à la hauteur maximale de ScrollView. Ma mise en page ressemble à quelque chose comme:

level    layout    layout_width    layout_height
1    LinearLayout    fill_parent    fill_parent
2    LinearLayout    fill_parent    wrap_content
3    (some irrelevant stuff)
2    ScrollView      fill_parent    fill_parent <-- this expands full height
3    LinearLayout    fill_parent    fill_parent <-- this does not (has orientation=vertical)
(following stuff probably are irrelevant, but just to be sure:)
4    TextView        fill_parent    fill_parent
4    LinearLayout    fill_parent    wrap_content

Je peux voir que le LinearLayout n'augmente pas toute la hauteur du ScrollView car dans Eclipse dans Android Layout Editor, si je sélectionne le ScrollView (dans le panneau Plan), il est mis en surbrillance avec une bordure rouge qui remplit l'écran jusqu'en bas, mais lorsque je sélectionne la LinearLayout sa mise en surbrillance ne s'étend pas au bas de l'écran. Comment puis-je le faire pour le faire?

L’effet recherché est d’avoir du texte et un bouton en dessous (à l’intérieur de la LinearLayout du niveau 4, il n’ya qu’un bouton). Le texte peut être assez gros pour nécessiter une barre de défilement. Dans ce cas, je souhaite que l'utilisateur ait à faire défiler l'écran vers le bas pour voir le bouton. Au cas où le texte ne serait pas assez grand pour une barre de défilement, je veux que le LinearLayout contenant le bouton reste au bas de l'écran.

Au début, j’ai pensé que je ne devrais pas publier le code XML complet car c’est généralement un refus de voir une énorme quantité de code dans une question. Cependant, il semble que cela pourrait être nécessaire, alors voici la mise en page complète.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent"
    Android:orientation="vertical"
    xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:orientation="horizontal"
        Android:id="@+id/video_layout"
        Android:focusable="true"
        style="@style/VideoLayout">
        <FrameLayout
            Android:layout_width="wrap_content"
            Android:layout_height="wrap_content"
            Android:foreground="@Android:drawable/ic_media_play"
            Android:foregroundGravity="center">
            <ImageView
                Android:layout_width="wrap_content"
                Android:layout_height="wrap_content"
                Android:id="@+id/video_thumb"
                Android:padding="5dip"
                Android:background="#454545"/>
        </FrameLayout>
        <TextView
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content"
            Android:focusable="true"
            style="@style/VideoTitle"
            Android:id="@+id/video_title"
            Android:layout_gravity="center"
            Android:layout_weight="1"/>
    </LinearLayout>
    <ScrollView
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:layout_weight="1">
        <!-- this ScrollView expands the full height of the screen.
             However, the next LinearLayout does not expand the full height of the ScrollView -->
        <LinearLayout
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"
            Android:layout_weight="1"
            Android:layout_gravity="fill"
            Android:orientation="vertical"
            Android:id="@+id/info_layout">
            <TextView
                Android:layout_width="fill_parent"
                Android:layout_height="fill_parent"
                Android:id="@+id/info_body"
                style="@style/InfoText"/>
            <LinearLayout
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:orientation="horizontal"
                style="@Android:style/ButtonBar">
                    <Button
                        Android:layout_width="wrap_content"
                        Android:layout_height="wrap_content"
                        Android:layout_gravity="center"
                        Android:layout_weight="1"
                        Android:text="@string/button_readmore"
                        Android:id="@+id/btn_read_more"/>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

Pour le moment, j’ai eu recours à Android:layout_gravity="bottom" sur la problématique LinearLayout, ce qui fait que le bouton reste enfoncé au bas de l’écran, quoi qu’il en soit. Mais cela rend également le texte collé au bas de l'écran, ce qui n'est pas exactement ce que je recherchais.

Mise à jour: Grattez cela, Android:layout_gravity="bottom" rend la ScrollView incapable de faire défiler. D'autres idées?

359
Felix

J'ai trouvé la solution moi-même à la fin. Le problème n'était pas avec la LinearLayout, mais avec la ScrollView (semble étrange, compte tenu du fait que la ScrollViewétait en expansion, tandis que la LinearLayout n'était pas).

La solution consistait à utiliser Android:fillViewport="true" sur le ScrollView.

938
Felix

Je sais que ce post est très ancien, pour ceux qui ne veulent pas utiliser Android:fillViewport="true" parce qu'il ne fait parfois pas apparaître l'editext au-dessus du clavier. Utilisez la disposition relative au lieu de LinearLayout pour résoudre le problème.

21
Hardik4560

Pouvez-vous fournir votre mise en page XML? Cela permettrait aux gens de recréer le problème avec un minimum d'effort.

Vous devrez peut-être définir

Android:layout_weight="1"

pour l'élément que vous voulez développer

8
snctln

J'ai utilisé dynamiquement pour cela. J'ai un LinearLayout et dans ce ScrollView utilisé comme un enfant. Ensuite, je reprends LinearLayout et ajoute ce que vous voulez Voir à ce LinearLayout, puis ce LinearLayout ajoute à ScrollView et ajoute enfin ce ScrollView à LinearLayout. Ensuite, vous pouvez faire défiler dans votre ScrollView et rien ne sera laissé visible.

LinearLayout (Parent) - ScrollView (enfant de LinerLayout) - LinearLayout (enfant de ScrollView) - ajoutez ici textView, Boutons, Spinner, etc. comme vous le souhaitez. Ajoutez ensuite ce LinearLyout à ScrollView. Bcoz ne peut s’appliquer qu’à un seul ENFANT pour ScrollView et ajoutez pour la dernière fois ce ScrollView à LinearLyout.Si la zone définie dépasse la taille de l’écran, vous obtiendrez un Scroll dans ScrollView.

2
Braj

Dans mon cas, je n'ai pas donné le

orientation de LinearLayout (l'enfant de ScrollView)

Donc, par défaut, l'horloge est horizontale, mais scrollview défile verticalement. Vérifiez donc si 'Android: orientation = "vertical" est défini sur l'enfant de votre ScrollView (dans le cas de LinearLayout).

C'était mon cas, j'espère que ça aide quelqu'un

.

1
Vishal Pandey

La solution est d'utiliser

Android:fillViewport="true"

sur voir la vue défilement et essayez en outre d'utiliser

"wrap_content" au lieu de "fill_parent" comme "fill_parent"

est obsolète maintenant.

0
Khushboo Aggarwal