LinearLayout ne se développe pas à l'intérieur d'un ScrollView

371

J'ai un LinearLayoutintérieur ScrollViewqui a android:layout_height="fill_parent", mais il ne s'étend pas sur toute la hauteur du ScrollView. Ma disposition ressemble à ceci:

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 LinearLayoutne s'étend pas sur toute la hauteur du ScrollViewparce que dans Eclipse dans Android Layout Editor, si je sélectionne le ScrollView(dans le panneau Contour), il est mis en surbrillance avec une bordure rouge qui remplit l'écran vers le bas mais quand je sélectionne le LinearLayoutson surlignage ne s'étend pas au bas de l'écran. Comment puis-je le faire faire?

L'effet que j'essaie d'obtenir est d'avoir du texte et un bouton en dessous (à l'intérieur du LinearLayoutniveau 4, il n'y a qu'un bouton). Le texte peut être suffisamment grand pour nécessiter une barre de défilement, auquel cas je souhaite que l'utilisateur doive faire défiler vers le bas pour voir le bouton. Dans le cas où le texte n'est pas assez grand pour une barre de défilement, je veux que le LinearLayoutcontenant le bouton reste en bas de l'écran.

Au début, je pensais que je ne devrais pas publier l'intégralité du XML, car c'est généralement un refus de voir un énorme morceau de code dans une question. Cependant, il semble que cela soit 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"la problématique LinearLayout, qui fait que le bouton reste collé au bas de l'écran quoi qu'il arrive. Mais cela fait également coller le texte au bas de l'écran, ce qui n'est pas exactement ce que je recherchais.

Mise à jour: gratter cela, android:layout_gravity="bottom"rend ScrollViewimpossible le défilement. D'autres idées?

Felix
la source

Réponses:

956

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

La solution était d'utiliser android:fillViewport="true"sur le ScrollView.

Felix
la source
4
Notez que le LinearLayout se développera verticalement, mais cela peut ne pas nécessairement être reflété dans votre disposition à moins qu'il ne contienne un contrôle qui consomme cet espace supplémentaire à l'aide android:weight.
Paul Lammertsma
Cela aide vraiment. Merci pour ça. Mais sans ce code fonctionne parfois bien. Est-ce que tu sais pourquoi?
Ashokchakravarthi Nagarajan
ne fonctionne pas pour <LinearLayout android: layout_width = "fill_parent" android: layout_height = "wrap_content" android: fillViewport = "true" android: background = "# 000" android: orientation = "vertical"> </LinearLayout>
Prasad
3
Tellement malade que j'étais assis pendant des heures et que je cherchais ce qui ne va pas avec mon code. Pour quoi ce paramètre? Quand voudriez-vous un jour la mettre en faux?
MyWay
@Prasad fait votre hauteur de disposition linéaire pour correspondre au parent
goonerDroid
22

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

Hardik4560
la source
8

Pouvez-vous fournir votre mise en page xml? Cela permettrait aux utilisateurs 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 souhaitez développer

snctln
la source
1
Merci pour votre réponse. J'ai essayé votre suggestion, mais cela n'a pas fonctionné. J'ai également mis à jour ma question pour inclure la mise en page xml.
Felix
3

La solution est d'utiliser

android:fillViewport="true"

en mode Défilement et essayez en outre d'utiliser

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

est obsolète maintenant.

Khushboo Aggarwal
la source
2

J'ai utilisé dynamiquement pour l'obtenir. J'ai un LinearLayout et dans ce ScrollView utilisé comme un enfant. Ensuite, je reprends LinearLayout et j'ajoute ce que vous voulez voir à ce LinearLayout, puis ce LinearLayout s'ajoute à ScrollView et enfin j'ajoute ce ScrollView à LinearLayout. Ensuite, vous pouvez obtenir un défilement dans votre ScrollView et rien ne restera visible.

LinearLayout (Parent) - ScrollView (enfant de LinerLayout) - LinearLayout (enfant de ScrollView) - ajoutez ici textView, Buttons, spinner etc. tout ce que vous voulez. Ajoutez ensuite ce LinearLyout à ScrollView. Bcoz un seul ENFANT pour ScrollView applicable et ajoutez en dernier ce ScrollView à LinearLyout.Si la zone définie dépasse la taille de l'écran, vous obtiendrez un défilement dans ScrollView.

Braj
la source
Mais cette solution rend le xml plus compliqué et prend plus de temps à se gonfler.
twlkyao
1

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

orientation de LinearLayout (ScrollView's Child)

Donc, par défaut, cela prend horizontal, mais scrollview défile verticalement, veuillez donc vérifier si 'android: orientation = "vertical"' est défini sur l'enfant de votre ScrollView (dans le cas de LinearLayout).

Ce fut mon cas espère que cela aide quelqu'un

.

Vishal Pandey
la source