La vue a unminHeight
mais manque d'une manière ou d'une autremaxHeight
:
Ce que j'essaie de réaliser, c'est que certains éléments (vues) remplissent un fichier ScrollView
. Quand il y a 1..3 éléments, je veux les afficher directement. Cela signifie que le ScrollView
a la hauteur de 1, 2 ou 3 éléments.
Lorsqu'il y a 4 éléments ou plus, je souhaite que le ScrollView
développement cesse (donc a maxHeight
) et commence à fournir le défilement.
Cependant, il n'existe malheureusement aucun moyen de définir un fichier maxHeight
. Donc, je dois probablement définir ma ScrollView
hauteur par programme sur soit WRAP_CONTENT
lorsqu'il y a 1..3 éléments et définir la hauteur sur 3*sizeOf(View)
lorsqu'il y a 4 éléments ou plus.
Quelqu'un peut-il expliquer pourquoi il n'y en a pas maxHeight
, alors qu'il y en a déjà un minHeight
?
(BTW: certaines vues, comme ImageView
avoir un maxHeight
implémenté.)
Réponses:
Aucune de ces solutions ne fonctionnait pour ce dont j'avais besoin, à savoir un ScrollView défini sur wrap_content mais ayant un maxHeight afin qu'il cesse de s'étendre après un certain point et commence à défiler. J'ai simplement remplacé la méthode onMeasure dans ScrollView.
Cela peut ne pas fonctionner dans toutes les situations, mais cela me donne certainement les résultats nécessaires pour ma mise en page. Et il répond également au commentaire de madhu.
la source
Pour créer un
ScrollView
ouListView
avec un maxHeight, il vous suffit de créer un Transparent LinearLayout autour de lui avec une hauteur de ce que vous voulez que maxHeight soit. Vous définissez ensuite la hauteur de ScrollView surwrap_content
. Cela crée un ScrollView qui semble s'agrandir jusqu'à ce que sa hauteur soit égale à la LinearLayout parent.la source
Cela a fonctionné pour moi pour le rendre personnalisable en xml:
MaxHeightScrollView.java:
attr.xml
exemple de mise en page
la source
(Je sais que cela ne répond pas directement à la question mais pourrait être utile à d'autres personnes recherchant la fonctionnalité maxHeight)
ConstraintLayout offre une hauteur maximale pour ses enfants via
ou
Exemple d'utilisation ici .
la source
J'aurais commenté la réponse de Whizzle si je le pouvais, mais j'ai pensé qu'il était utile de noter que pour que je puisse résoudre ce problème dans le contexte du mode multi-fenêtre sous Android N, j'avais besoin de modifier légèrement le code pour ceci:
Cela permet à la mise en page d'être redimensionnée pour être plus petite que la hauteur maximale, mais aussi l'empêcher d'être plus grande que la hauteur maximale. J'ai utilisé ceci est une classe de mise en page qui remplace
RelativeLayout
et cela m'a permis de créer une boîte de dialogue personnalisée avecScrollView
comme enfant deMaxHeightRelativeLayout
qui n'élargit pas toute la hauteur de l'écran et se rétrécit également pour s'adapter à la plus petite taille de veuve en multi-fenêtre pour Android N.la source
Il n'y a aucun moyen de définir maxHeight. Mais vous pouvez définir la hauteur.
Pour ce faire, vous devrez découvrir la hauteur de chaque élément de votre scrollView. Après cela, définissez simplement la hauteur de scrollView sur numberOfItens * heightOfItem.
Pour découvrir la hauteur d'un élément, procédez comme suit:
Pour régler la hauteur, procédez comme suit:
la source
Enroulez votre
ScrollView
autour de votre plaineLinearLayout
avec layout_height = "max_height", cela fera un travail parfait. En fait, j'ai ce code en production des 5 dernières années sans aucun problème.la source
Ma
MaxHeightScrollView
vue personnaliséestyle.xml
En utilisant
la source
J'ai une réponse ici:
https://stackoverflow.com/a/29178364/1148784
Créez simplement une nouvelle classe étendant ScrollView et remplacez sa
onMeasure
méthode.la source
Comme mentionné ci-dessus, ConstraintLayout offre une hauteur maximale pour ses enfants via:
En outre, si la hauteur maximale d'un enfant de ConstraintLayout est incertaine jusqu'à l'exécution de l'application, il existe toujours un moyen de faire en sorte que cet enfant adapte automatiquement une hauteur modifiable, peu importe où il a été placé dans la chaîne verticale.
Par exemple, nous devons afficher une boîte de dialogue du bas avec un en-tête TextView mutable, un ScrollView mutable et un pied de page TextView mutable. La hauteur maximale de la boîte de dialogue est de 320dp , lorsque la hauteur totale n'atteint pas 320dp. ScrollView agit comme wrap_content, lorsque la hauteur totale dépasse ScrollView agit comme "maxHeight = 320dp - hauteur de l'en-tête - hauteur du pied de page".
Nous pouvons y parvenir simplement via un fichier de mise en page xml:
La plupart des codes d'importation sont courts:
L'utilisation horizontale de maxWidth est tout à fait la même.
la source
Avez-vous essayé d'utiliser la valeur layout_weight ? Si vous en définissez une sur une valeur supérieure à 0, cela étendra cette vue dans l'espace restant disponible.
Si vous aviez plusieurs vues qui devaient être étirées, la valeur deviendra un poids entre elles.
Donc, si vous aviez deux vues définies sur une valeur layout_weight de 1, elles s'étireraient toutes les deux pour remplir l'espace, mais elles s'étireraient toutes les deux sur une quantité d'espace égale. Si vous définissez l'un d'entre eux sur la valeur 2, il s'étirerait deux fois plus que l'autre vue.
Quelques informations supplémentaires ici répertoriées sous Disposition linéaire.
la source
maxHeight
que je puisse régler sur une valeur de creux spécifique. (J'ai finalement fini par calculer et définir les hauteurs par programme)Je pense que vous pouvez régler la hauteur au moment de l'exécution pour 1 article seulement
scrollView.setHeight(200px)
, pour 2 articlesscrollView.setheight(400px)
pour 3 ou plusscrollView.setHeight(600px)
la source
Comme nous le savons, les appareils exécutant Android peuvent avoir différentes tailles d'écran. Comme nous le savons par ailleurs, les vues doivent s'ajuster dynamiquement et devenir l'espace qui convient.
Si vous définissez une hauteur maximale, vous forcez peut-être la vue à ne pas avoir suffisamment d'espace ou à prendre moins d'espace. Je sais que parfois, il semble être pratiquement de définir une hauteur maximale. Mais si jamais la résolution change radicalement, et elle le sera !, alors la vue, qui a une hauteur maximale, ne semblera pas appropriée.
Je pense qu'il n'y a pas de moyen approprié de faire exactement la mise en page que vous voulez. Je vous recommande de réfléchir à votre mise en page en utilisant des gestionnaires de mise en page et des mécanismes relatifs. Je ne sais pas ce que vous essayez d'accomplir, mais cela me semble un peu étrange qu'une liste ne montre que trois éléments, puis l'utilisateur doit faire défiler.
btw. minHeight n'est pas garanti (et ne devrait peut-être pas exister non plus). cela peut avoir un certain avantage de forcer les éléments à être visibles tandis que d'autres éléments relatifs deviennent plus petits.
la source
Si quelqu'un envisage d'utiliser la valeur exacte pour LayoutParams, par exemple
N'oubliez pas de prendre en compte la densité de l'affichage de l'appareil, sinon vous pourriez avoir un comportement très étrange sur différents appareils. Par exemple:
la source
Obtenez d'abord la hauteur de l'élément en pixels
alors simplement
la source
si vous voulez créer une vue de défilement ou une vue de liste sans débordement, mais uniquement sur un RelativeLayout avec une vue de dessus et une vue de dessous en haut et en bas:
la source
J'ai utilisé un ScrollView personnalisé fait dans Kotlin qui utilise
maxHeight
. Exemple d'utilisation:Voici le code de
ScrollViewWidthMaxHeight
:qui a également besoin de cette déclaration dans
values/attrs.xml
:la source