Je travaille sur une mise en page de formulaire pour une connexion Activity
dans mon application Android. L'image ci-dessous est à quoi je veux ressembler:
J'ai pu réaliser cette disposition avec le XML suivant . Le problème est que c'est un peu hackish. J'ai dû coder en dur une largeur pour l'hôte EditText. Plus précisément, je devais préciser:
android:layout_width="172dp"
J'aimerais vraiment donner un pourcentage de largeur à l'hôte et au port EditText. (Quelque chose comme 80% pour l'hôte, 20% pour le port.) Est-ce possible? Le XML suivant fonctionne sur mon Droid, mais il ne semble pas fonctionner pour tous les écrans. J'aimerais vraiment une solution plus robuste.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/main"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/host_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/home"
android:paddingLeft="15dp"
android:paddingTop="0dp"
android:text="host"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<TextView
android:id="@+id/port_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/home"
android:layout_toRightOf="@+id/host_input"
android:paddingTop="0dp"
android:text="port"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<EditText
android:id="@+id/host_input"
android:layout_width="172dp"
android:layout_height="wrap_content"
android:layout_below="@id/host_label"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="4dp"
android:background="@android:drawable/editbox_background"
android:inputType="textEmailAddress" />
<EditText
android:id="@+id/port_input"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_below="@id/host_label"
android:layout_marginTop="4dp"
android:layout_toRightOf="@id/host_input"
android:background="@android:drawable/editbox_background"
android:inputType="number" />
<TextView
android:id="@+id/username_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/host_input"
android:paddingLeft="15dp"
android:paddingTop="15dp"
android:text="username"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<EditText
android:id="@+id/username_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/username_label"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="4dp"
android:background="@android:drawable/editbox_background"
android:inputType="textEmailAddress" />
<TextView
android:id="@+id/password_label"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/username_input"
android:paddingLeft="15dp"
android:paddingTop="15dp"
android:text="password"
android:textColor="#a5d4e2"
android:textSize="25sp"
android:textStyle="normal" />
<EditText
android:id="@+id/password_input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@id/password_label"
android:layout_marginLeft="15dp"
android:layout_marginRight="15dp"
android:layout_marginTop="4dp"
android:background="@android:drawable/editbox_background"
android:inputType="textPassword" />
<ImageView
android:id="@+id/home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_centerVertical="false"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:paddingTop="15dp"
android:scaleType="fitStart"
android:src="@drawable/home" />
<Button
android:id="@+id/login_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/password_input"
android:layout_marginLeft="15dp"
android:layout_marginTop="15dp"
android:text=" login "
android:textSize="18sp" >
</Button>
</RelativeLayout>
Réponses:
Vous recherchez l'
android:layout_weight
attribut. Il vous permettra d'utiliser des pourcentages pour définir votre mise en page.Dans l'exemple suivant, le bouton gauche utilise 70% de l'espace et le bouton droit 30%.
Cela fonctionne de la même manière avec n'importe quel type de vue, vous pouvez remplacer les boutons par du EditText pour répondre à vos besoins.
Assurez - vous de régler la
layout_width
à0dp
ou vos points de vue ne peuvent pas être mis à l' échelle correctement.Notez que la somme de poids n'a pas à être égale à 1, je trouve cela plus facile à lire comme ça. Vous pouvez régler le premier poids sur 7 et le second sur 3 et cela donnera le même résultat.
la source
Cela ne répond pas tout à fait à la question d'origine, qui concernait une répartition 70/30, mais dans le cas particulier d'une répartition 50/50 entre les composants, il existe un moyen: placez une jambe invisible au centre et utilisez-la pour positionner le deux composantes d'intérêt.
Comme il s'agit d'un cas assez courant, cette solution est plus qu'une curiosité. C'est un peu un hack mais efficace car le support vide de taille zéro devrait coûter très peu.
En général, cependant, il est préférable de ne pas trop attendre des mises en page Android d'origine ...
la source
RelativeLayout
?android:visibility="invisible"
sur la jambe de force pour ignorer l'appel onDraw;)Mise à jour 1
Comme indiqué par @EmJiHash PercentRelativeLayout est déconseillé au niveau API 26.0.0
Ci-dessous, citant un commentaire Google:
Google a introduit une nouvelle API appelée android.support.percent
Ensuite, vous pouvez simplement spécifier le pourcentage à prendre par vue
Ajouter une dépendance de compilation comme
en ce que PercentRelativeLayout est ce que nous pouvons faire une mise en page en pourcentage
la source
Vous ne pouvez pas utiliser de pourcentages pour définir les dimensions d'une vue dans un RelativeLayout. La meilleure façon de le faire est d'utiliser la mise en page linéaire et les poids, ou une mise en page personnalisée.
la source
Vous pouvez jeter un œil à la nouvelle bibliothèque de support de pourcentage.
docs
échantillon
la source
Vous pouvez utiliser PercentRelativeLayout , il s'agit d'un ajout récent non documenté à la bibliothèque de support de conception , qui permet de spécifier non seulement les éléments les uns par rapport aux autres, mais également le pourcentage total de l'espace disponible.
Le package Percent fournit des API pour prendre en charge l'ajout et la gestion du pourcentage dimensions basées sur un dans votre application.
Pour l'utiliser, vous devez ajouter cette bibliothèque à votre liste de dépendances Gradle :
la source
android:layout_width="match_parent"
J'ai résolu ce problème en créant une vue personnalisée:
C'est une jambe invisible que je peux utiliser pour aligner d'autres vues dans RelativeLayout.
la source
Mise à jour
Google a introduit une nouvelle API appelée android.support.percent
1) PercentRelativeLayout
2) PercentFrameLayout
Ajouter une dépendance de compilation comme
Vous pouvez spécifier la dimension en pourcentage afin de bénéficier à la fois de l'avantage
RelativeLayout
et du pourcentagela source
Étant donné que PercentRelativeLayout a été déconseillé dans 26.0.0 et que les présentations imbriquées comme LinearLayout dans RelativeLayout ont un impact négatif sur les performances ( Comprendre les avantages de ConstraintLayout performances ), la meilleure option pour atteindre un pourcentage de largeur est de remplacer votre RelativeLayout par ConstraintLayout.
Cela peut être résolu de deux manières.
SOLUTION # 1 Utilisation de directives avec pourcentage de décalage
SOLUTION # 2 Utilisation d'une chaîne avec une largeur pondérée pour EditText
Dans les deux cas, vous obtenez quelque chose comme ça
la source
PercentRelativeLayout est obsolète par rapport à la révision 26.0.0 de la bibliothèque de support.
Google a introduit une nouvelle mise en page appelée ConstraintLayout .
Ajoutez la bibliothèque en tant que dépendance dans votre fichier build.gradle au niveau du module:
ajoutez simplement un fichier de mise en page:
Contraintes
Les contraintes vous aident à garder les widgets alignés. Vous pouvez utiliser des ancres, telles que les poignées de contrainte illustrées ci-dessous, pour déterminer les règles d'alignement entre divers widgets.
Wrap Content
: La vue s'agrandit selon les besoins pour s'adapter à son contenu.Match Constraints
: La vue s'élargit selon les besoins pour répondre à la définition de ses contraintes après prise en compte des marges. Cependant, si la dimension donnée n'a qu'une seule contrainte, la vue se développe pour s'adapter à son contenu. L'utilisation de ce mode sur la hauteur ou la largeur vous permet également de définir un rapport de taille.Fixed
: Vous spécifiez une dimension spécifique dans la zone de texte ci-dessous ou en redimensionnant la vue dans l'éditeur.Spread
: Les vues sont réparties uniformément (après prise en compte des marges). C'est la valeur par défaut.Spread inside
: La première et la dernière vue sont apposées sur les contraintes à chaque extrémité de la chaîne et les autres sont réparties uniformément.Weighted
: Lorsque la chaîne est définie pour s'étendre ou s'étendre à l'intérieur, vous pouvez remplir l'espace restant en définissant une ou plusieurs vues pour qu'elles correspondent aux contraintes (0dp). Par défaut, l'espace est réparti uniformément entre chaque vue définie pour "correspondre aux contraintes", mais vous pouvez attribuer un poids d'importance à chaque vue à l'aide des attributs layout_constraintHorizontal_weight et layout_constraintVertical_weight. Si vous connaissez layout_weight dans une mise en page linéaire, cela fonctionne de la même manière. Ainsi, la vue avec la valeur de poids la plus élevée obtient le plus d'espace; les vues qui ont le même poids obtiennent la même quantité d'espace.Packed
: Les vues sont regroupées (après prise en compte des marges). Vous pouvez ensuite ajuster le biais de la chaîne entière (gauche / droite ou haut / bas) en modifiant le biais de vue de tête de la chaîne.Center Horizontally or Center Vertically
: Pour créer rapidement une chaîne de vues, sélectionnez-les toutes, cliquez avec le bouton droit sur l'une des vues, puis sélectionnez Centrer horizontalement ou Centrer verticalement, pour créer une chaîne horizontale ou verticaleBaseline alignment
: Aligner la ligne de base de texte d'une vue sur la ligne de base de texte d'une autre vue.Constrain to a guideline
: Vous pouvez ajouter une ligne directrice verticale ou horizontale à laquelle vous pouvez contraindre les vues, et la ligne directrice sera invisible pour les utilisateurs de l'application. Vous pouvez positionner la ligne directrice dans la présentation en fonction des unités dp ou du pourcentage, par rapport au bord de la présentation.Adjust the constraint bias
: Lorsque vous ajoutez une contrainte des deux côtés d'une vue (et que la taille de la vue pour la même dimension est "fixe" ou "envelopper le contenu"), la vue devient centrée entre les deux contraintes avec un biais de 50% par défaut. Vous pouvez ajuster le biais en faisant glisser le curseur de biais dans la fenêtre PropriétésSet size as a ratio
: Vous pouvez définir la taille de la vue à un rapport tel que 16: 9 si au moins une des dimensions de la vue est définie sur "match contraintes" (0dp).Vous pouvez en savoir plus sur le doc officiel .
la source
Vous pouvez le faire via des pondérations de mise en page. Un poids dicte la répartition des parties non réclamées de l'écran. Donnez à chaque EditText une layout_width de 0 et un poids proportionnel. C'est-à-dire, donnez à l'un un poids de 2 et l'autre un poids de 1 si vous voulez que le premier occupe deux fois plus d'espace.
la source
Chose intéressante, en s'appuyant sur la réponse de @olefevre, on peut non seulement faire des mises en page 50/50 avec des "entretoises invisibles", mais toutes sortes de mises en page impliquant des pouvoirs de deux.
Par exemple, voici une disposition qui coupe la largeur en quatre parties égales (en fait trois, avec des poids de 1, 1, 2):
la source
Il vous suffit de placer vos deux hôtes textView et port dans une horizontale linéaire indépendante et d'utiliser Android: layout_weight pour faire le pourcentage
la source
Vérifiez https://github.com/mmin18/FlexLayout que vous pouvez utiliser pour cent ou expression java directement dans la mise en page XML.
la source