TD; DR
La largeur de la vue doit correspondre exactement à la moitié de l'écran et être centrée. Utilisation de ConstraintLayout.
Notez que la vue n'a pas de largeur intérieure.
<View Android:background="#ff0000" ... />
Question d'origine
Je voudrais réaliser une mise en page où la taille de la vue est la moitié de la taille de l'écran et centrée horizontalement.
Quelque chose comme ceci: | --view-- |
Je ne trouve aucun moyen d'utiliser ConstraintLayout. Le meilleur que j'ai trouvé est d'utiliser app:layout_constraintHorizontal_weight="1"
sur 2 fausses vues positionnées respectivement à gauche et à droite et app:layout_constraintHorizontal_weight="1.5"
à mon avis.
Une meilleure façon?
Avec la version bêta, vous pouvez utiliser des largeurs en pourcentage. Si vous ne pouvez pas utiliser la version bêta, vous pouvez utiliser deux directives verticales: une à 25% de la largeur de l'écran et une à 75% de la largeur. La vue avec une largeur de 0dp
serait limité entre ces deux lignes directrices. Cette configuration vous donnera une vue qui est 1/2 de la largeur de l'écran et également centrée.
Le XML suivant illustre les deux façons; une utilisant la version bêta ConstraintLayout
et la seconde utilisant des fonctionnalités disponibles dans la version de production actuelle.
<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/activity_main_inference"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<View
Android:id="@+id/viewTop"
Android:layout_width="0dp"
Android:layout_height="100dp"
Android:layout_marginTop="16dp"
Android:background="@Android:color/darker_gray"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent="0.5" />
<Android.support.constraint.Guideline
Android:id="@+id/guidelineLeft"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical"
app:layout_constraintGuide_percent="0.25" />
<View
Android:layout_width="0dp"
Android:layout_height="100dp"
Android:layout_marginTop="16dp"
Android:background="@Android:color/darker_gray"
app:layout_constraintEnd_toStartOf="@id/guidelineRight"
app:layout_constraintStart_toEndOf="@id/guidelineLeft"
app:layout_constraintTop_toBottomOf="@id/viewTop" />
<Android.support.constraint.Guideline
Android:id="@+id/guidelineRight"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical"
app:layout_constraintGuide_percent="0.75" />
</Android.support.constraint.ConstraintLayout>
Depuis "ConstraintLayout1.1.0-beta1", vous pouvez utiliser le pourcentage pour définir les largeurs et les hauteurs.
Android:layout_width="0dp"
app:layout_constraintWidth_default="percent"
app:layout_constraintWidth_percent=".4"
Ceci définira le avec à 40% de la largeur de l'écran. Une combinaison de cela et des directives en pourcentage vous permet de créer la mise en page en pourcentage que vous souhaitez.
essayez cette division verticale
<Android.support.constraint.ConstraintLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<Android.support.constraint.ConstraintLayout
Android:id="@+id/clPart1"
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:background="@color/white"
Android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHorizontal_chainStyle="spread"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/clPart2">
</Android.support.constraint.ConstraintLayout>
<Android.support.constraint.ConstraintLayout
Android:id="@+id/clPart2"
Android:layout_width="0dp"
Android:layout_height="match_parent"
Android:background="@color/black"
Android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@+id/clPart1"
app:layout_constraintRight_toRightOf="parent">
</Android.support.constraint.ConstraintLayout>
</Android.support.constraint.ConstraintLayout>
Avec ConstraintLayout, vous pouvez centrer une vue à l'écran comme ceci:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="0dp"
Android:layout_height="0dp"
Android:background="#FF0000"
Android:orientation="vertical"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHeight_percent=".5"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintWidth_percent=".5"></LinearLayout>
</Android.support.constraint.ConstraintLayout>
Mettez à jour votre gradle vers la dernière version de ConstraintLayout:
dependencies {
...
implementation 'com.Android.support.constraint:constraint-layout:1.1.3'
}
Résultat
Ce que vous devez faire, c'est:
Ajoutez simplement ceci dans votre XML
<View
Android:id="@+id/viewV1"
Android:layout_height="match_parent"
Android:background="#ff0000"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
Android:layout_width="match_parent"
/>
Et cela dans votre Java.
Importez-les d'abord.
import Android.graphics.Point;
import Android.support.constraint.ConstraintLayout;
import Android.view.Display;
import Android.view.View;
Ajoutez ensuite ces lignes dans la fonction onCreate de votre fichier Java.
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width1 = size.x;
//int height = size.y;
View v = findViewById(R.id.viewV1);
ConstraintLayout.MarginLayoutParams params = (ConstraintLayout.MarginLayoutParams) v.getLayoutParams();
params.width = width1/2; params.leftMargin = width1/4; params.rightMargin = width1/4;
v.setLayoutParams(params);
Vous pouvez également définir la hauteur à l'aide de cette méthode. Et oui, cette vue utilise la moitié de la largeur de l'écran quelle que soit la taille de l'écran.
Comme vous ne voulez pas le faire via Java. Ajoutez ceci à votre XML.
<Android.support.constraint.Guideline
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/guideline5"
app:layout_constraintGuide_begin="411dp"
Android:orientation="vertical"
/>
En le sélectionnant, déplacez cette ligne directrice à la fin de l'écran et notez cette valeur app:layout_constraintGuide_begin="411dp"
. Quelle que soit la valeur, c'est la largeur de votre écran.
Ajoutez marginStart
et marginEnd
à votre vue en 411/4 dp. (calculez cette valeur, XML ne le fera pas).
Cela rendra votre vue au centre avec une demi-largeur comme parent.
N'oubliez pas que tous les écrans ne sont pas 411dp. Cela ne fonctionnera pas pour la taille d'écran de chaque téléphone.