Je veux créer une mise en page qui me permette de faire défiler vers le bas en utilisant la mise en page de contraintes, mais je ne sais pas comment m'y prendre. Devrait-il ScrollView
être le parent de ce ConstraintLayout
genre de choses?
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<android.support.constraint.ConstraintLayout
android:id="@+id/Constraint"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
Ou l'inverse? Peut-être que quelqu'un peut m'indiquer un bon tutoriel à ce sujet ou donner un exemple, je n'arrive pas à en trouver un.
De plus, je ne sais pas s'il s'agit d'un bogue ou d'une configuration que je n'ai pas configurée mais j'ai vu des images comme celle-ci:
où il y a des composants en dehors du plan "rectangle bleu" mais ils sont visibles, tandis que de mon côté, si je place un composant sur "l'espace blanc", je ne peux pas le voir ou le déplacer n'importe où, et il apparaît sur l'arborescence des composants .
METTRE À JOUR :
J'ai trouvé un moyen de faire défiler la disposition de contrainte dans l'outil de conception, en utilisant une ligne de guidage horizontale pour abaisser la bordure de disposition de contrainte et l'étendre au-delà de l'appareil, après cela, vous pouvez utiliser la ligne directrice comme nouveau bas de la disposition de contrainte pour ancrer les composants.
Il existe un type de contrainte qui rompt la fonction de défilement:
Assurez-vous simplement que vous n'utilisez cette contrainte sur aucune vue lorsque vous souhaitez que vous
ConstraintLayout
puissiez faire défiler avecScrollView
:Si vous les supprimez, votre parchemin devrait fonctionner.
Explication:
Définir la hauteur de l'enfant pour qu'elle corresponde à celle d'un
ScrollView
parent est contradictoire avec ce que le composant est censé faire. Ce que nous voulons la plupart du temps, c'est que certains contenus de taille dynamique puissent faire défiler quand ils sont plus grands qu'un écran / cadre; faire correspondre la hauteur avec le parentScrollView
forcerait tout le contenu à être affiché dans un cadre fixe (la hauteur du parent), annulant ainsi toute fonctionnalité de défilement.Cela se produit également lorsque les composants enfants directs normaux sont définis sur
layout_height="match_parent"
.Si vous voulez que l'enfant de la
ScrollView
corresponde à la hauteur du parent lorsqu'il n'y a pas assez de contenu, définissez simplementandroid:fillViewport
sur true pour leScrollView
.la source
Utiliser NestedScrollView avec viewport true fonctionne bien pour moi
pour android x utilisez ceci
la source
app:layout_behavior="@string/appbar_scrolling_view_behavior"
Pour résumer, vous enveloppez essentiellement votre
android.support.constraint.ConstraintLayout
vue dans unScrollView
dans le texte du*.xml
fichier associé à votre mise en page.Exemple activity_sign_in.xml
Remarque 1: les barres de défilement n'apparaissent que si un enroulement est nécessaire de quelque manière que ce soit, y compris le clavier qui apparaît.
Remarque 2: Ce ne serait pas non plus une mauvaise idée de vous assurer que votre ConstraintLayout est suffisamment grand pour atteindre le bas et les côtés d'un écran donné, surtout si vous avez un arrière-plan, car cela garantira qu'il n'y a pas d'espaces blancs impairs. . Vous pouvez le faire avec des espaces si rien d'autre.
la source
Utilisez simplement la disposition de contrainte à l'intérieur
NestedScrollView
ouScrollView
.c'est tout. profitez de votre codage.
la source
Pour créer une mise en page déroulante, la mise en page est correcte. Il ne pourra pas faire défiler jusqu'à ce qu'il y ait une raison de faire défiler (comme dans n'importe quelle autre disposition). Ajoutez donc suffisamment de contenu et il pourra faire défiler, comme avec n'importe quelle mise en page (linéaire, relative, etc.). Cependant, vous ne pouvez pas faire défiler correctement en Blueprint ou en mode Création lors de la conception avec ConstraintLayout et ScrollView.
Sens:
Vous pouvez créer un ConstraintLayout défilant, mais il ne défilera pas correctement dans l'éditeur en raison d'un bogue / scénario qui n'a pas été pris en compte. Mais même si le défilement ne fonctionne pas dans l'éditeur, il fonctionne sur les appareils. (J'ai fait plusieurs COnstraintLayouts défilants, donc je l'ai testé)
Remarque
Concernant votre code. Il manque une balise de fermeture au ScrollView, je ne sais pas si c'est le cas dans le fichier ou s'il s'agit d'un échec de copier-coller, mais vous voudrez peut-être l'examiner.
la source
Pour compléter les réponses précédentes, j'ajoute l'exemple suivant, qui prend également en compte l'utilisation de l'AppBar. Avec ce code, l'éditeur de conception d'Android Studio semble fonctionner correctement avec le ConstraintLayout.
la source
vous devez entourer ma mise en page de contrainte avec une balise ScrollView et lui donner la propriété android: isScrollContainer = "true".
la source
Il y a un bogue dans la version 2.2 qui rend impossible le défilement du ConstraintLayout. Je suppose que cela existe toujours. Vous pouvez également utiliser LinearLayout ou RelativeLayout.
Vérifiez également: Est-il possible de mettre une disposition de contrainte dans un ScrollView .
la source
Constraintlayout est la valeur par défaut pour une nouvelle application. J'apprends maintenant à Android et j'ai eu beaucoup de mal à comprendre comment gérer le code "exemple" par défaut pour faire défiler lorsqu'un clavier est activé. J'ai vu de nombreuses applications où je dois fermer le clavier pour cliquer sur le bouton «Soumettre» et parfois cela ne disparaît pas. En utilisant cette hiérarchie [ScrollView / ContraintLayout / Fields], cela fonctionne très bien maintenant. De cette façon, nous pouvons bénéficier des avantages et de la facilité d'utilisation de ConstraintLayout dans une vue déroulante.
la source
Retirez le bouton du bas de la vue de défilement imbriquée et prenez la disposition linéaire comme parent. Ajoutez le bas et la vue de défilement imbriquée en tant que leurs enfants. Cela fonctionnera parfaitement. Dans le manifeste de l'activité, utilisez ceci - cela soulèvera le bouton lorsque le clavier sera ouvert
la source
Vous pouvez l'utiliser
HorizontalScrollView
et cela fonctionnera aussi!la source
Voici comment je l'ai résolu:
Si vous utilisez Nested ScrollView, c'est-à-dire ScrollView dans un ConstraintLayout, utilisez la configuration suivante pour ScrollView au lieu de "WRAP_CONTENT" ou "MATCH_PARENT":
la source
dans scrollview, faites la hauteur et la largeur 0 ajoutez les contraintes Top_toBottomOf et Bottom_toTopOf c'est tout.
la source
Pour moi, aucune des suggestions concernant la suppression des contraintes de fond ni la définition du conteneur de défilement sur true ne semblait fonctionner. Ce qui a fonctionné: étendre la hauteur des vues individuelles / imbriquées dans ma mise en page afin qu'elles "s'étendent" au-delà du parent en utilisant l'option "Développer verticalement" de l'éditeur de disposition de contraintes comme indiqué ci-dessous.
Pour toute approche, il est important que les lignes d'aperçu en pointillé s'étendent verticalement au-delà des dimensions supérieure ou inférieure du parent
la source