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