J'ai utilisé le paramètre layout_weight
pour définir la largeur des boutons à 70% de la largeur totale de la présentation, mais il me manque des détails importants pour que cela fonctionne.
(Une autre solution serait de travailler avec display.getWidth()
par programme, mais cela ne fonctionne pas non plus, car je ne sais pas à quoi mon fichier .xml devrait ressembler si je choisis de définir la largeur avec button.setWidth()
.)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent"
Android:layout_weight="1.0">
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="15px"
Android:id="@+id/userVersionTextViewNew"
Android:gravity="center"
Android:layout_centerVertical="true"/>
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="15px"
Android:gravity="center"
Android:layout_above="@id/userVersionTextViewNew"
Android:id="@+id/userSoftSerialNumberTextView"/>
<ImageView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:src="@drawable/logo_200"
Android:layout_above="@id/userSoftSerialNumberTextView"
Android:layout_centerHorizontal="true"/>
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="15px"
Android:gravity="center"
Android:layout_below="@id/userVersionTextViewNew"
Android:id="@+id/dummyTextView"/>
<Button
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/loginButton"
Android:text="Σύνδεση"
Android:layout_centerHorizontal="true"
Android:layout_below="@id/dummyTextView"
Android:layout_weight="0.7"/>
<Button
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/demoLoginButton"
Android:text="Δοκιμαστική χρήση"
Android:layout_centerHorizontal="true"
Android:layout_below="@id/loginButton"
Android:layout_weight="0.7"/>
</RelativeLayout>
Essaye ça..
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent">
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="15px"
Android:id="@+id/userVersionTextViewNew"
Android:gravity="center"
Android:layout_centerVertical="true"/>
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="15px"
Android:gravity="center"
Android:layout_above="@id/userVersionTextViewNew"
Android:id="@+id/userSoftSerialNumberTextView"/>
<ImageView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:src="@drawable/logo_200"
Android:layout_above="@id/userSoftSerialNumberTextView"
Android:layout_centerHorizontal="true"/>
<TextView
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textSize="15px"
Android:gravity="center"
Android:layout_below="@id/userVersionTextViewNew"
Android:id="@+id/dummyTextView"/>
<LinearLayout
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:gravity = "center_horizontal"
Android:layout_below="@id/dummyTextView"
Android:id="@+id/loginButtonLayout"
Android:weightSum="1.0">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/loginButton"
Android:text="Σύνδεση"
Android:layout_weight="0.7"/>
</LinearLayout>
<LinearLayout
Android:layout_height="wrap_content"
Android:layout_width="fill_parent"
Android:gravity = "center_horizontal"
Android:layout_below="@id/loginButtonLayout"
Android:weightSum="1.0">
<Button
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:id="@+id/demoLoginButton"
Android:text="Δοκιμαστική χρήση"
Android:layout_weight="0.7"/>
</LinearLayout>
</RelativeLayout>
Le problème
Vous ne pouvez pas utiliser les paramètres layout_weight sur un RelativeLayout. Ce sont des paramètres de LinearLayout. Je donnerai plus d'informations sur les différences plus tard. Mais d'abord sur la solution à cette question
Une solution
Utilisez un LinearLayout où vous pouvez positionner des éléments dans une ligne avec une distribution de poids. N'oubliez pas d'utiliser la largeur 0dp lors de l'ajout de layout_weights! L'exemple ci-dessous montre une répartition du poids de 70/30.
<LinearLayout
Android:id="@+id/wrapper"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:weightSum="1.0" >
<Button
Android:text="left"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight=".70" />
<Button
Android:text="right"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_weight=".30" />
</LinearLayout>
Tout cela dans le RelativeLayout que vous aviez déjà dans votre code. Le reste de cette réponse est une information de base que toutes les personnes ayant ces questions devraient lire afin de comprendre ce qu’elles font.
Disposition relative
Chaque fois que vous commencez avec une mise en page avec plus d'un élément, je vous conseille de préférer un RelativeLayout en faveur de la chose Linéaire. RelativeLayout est très puissant et vous permet de positionner des éléments les uns par rapport aux autres (leftOf, ci-dessous, ...). Dans la plupart des cas, c'est plus que nécessaire.
Un exemple tiré de le document de développement Android ((croyez-moi, tout est là):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:paddingLeft="16dp"
Android:paddingRight="16dp" >
<EditText
Android:id="@+id/name"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:hint="@string/reminder" />
<Spinner
Android:id="@+id/dates"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:layout_below="@id/name"
Android:layout_alignParentLeft="true"
Android:layout_toLeftOf="@+id/times" />
<Spinner
Android:id="@id/times"
Android:layout_width="96dp"
Android:layout_height="wrap_content"
Android:layout_below="@id/name"
Android:layout_alignParentRight="true" />
<Button
Android:layout_width="96dp"
Android:layout_height="wrap_content"
Android:layout_below="@id/times"
Android:layout_alignParentRight="true"
Android:text="@string/done" />
</RelativeLayout>
LinearLayout
LinearLayout peut également sembler très performant, mais pour que tout soit trié uniquement avec Linears, vous allez probablement commencer à imbriquer ces dispositions. Et c’est là que les performances sont laides.
Encore un exemple de la documentation de développement Android .
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:paddingLeft="16dp"
Android:paddingRight="16dp"
Android:orientation="vertical" >
<EditText
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:hint="@string/to" />
<EditText
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:hint="@string/subject" />
<EditText
Android:layout_width="fill_parent"
Android:layout_height="0dp"
Android:layout_weight="1"
Android:gravity="top"
Android:hint="@string/message" />
<Button
Android:layout_width="100dp"
Android:layout_height="wrap_content"
Android:layout_gravity="right"
Android:text="@string/send" />
</LinearLayout>
Je ne pense pas que layout_weight
fonctionne dans une RelativeLayout
. Peut-être devriez-vous ajouter une LinearLayout
dans la RelativeLayout
et utiliser layout_weight
à l'intérieur.
De même, lorsque vous utilisez layout_weight
, vous devez généralement avoir la largeur ou la hauteur de l'objet défini par 0dp
. Dans votre cas, procédez comme suit:
Android:layout_weight="0.7"
Android:layout_height="0dp"
Je sais que cette question est ancienne, mais juste pour quelqu'un qui cherche une solution:
Google a introduit une nouvelle API appelée Android.support.percent
PercentRelativeLayout
exactement votre cas:
<Android.support.percent.PercentRelativeLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_height="fill_parent"
Android:layout_width="fill_parent">
<!-- Other controls -->
<Button
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:id="@+id/loginButton"
Android:text="Σύνδεση"
Android:layout_centerHorizontal="true"
Android:layout_below="@id/dummyTextView"
app:layout_widthPercent="70%"/>
<!-- Other controls -->
</Android.support.percent.PercentRelativeLayout>
layout_weight, travaille sur le LinearLayout en tant que parent. Je pense donc que le problème est là. vous devez utiliser une combinaison de toutes les dispositions linéaires et relatives pour obtenir ce dont vous avez besoin.
Je pense que vous ne devriez pas définir Android:layout_weight="1.0"
dans Disposition relative tag, si vous souhaitez définir la longueur du bouton autre que le "wrap_content"
Comme @hcpl a correctement mentionné dans sa réponse:
Vous ne pouvez pas utiliser les paramètres layout_weight sur un RelativeLayout. Ce sont des paramètres de LinearLayout.
Oui, il a raison! Mais pensez à impact négatif sur les performances causé par les dispositions imbriquées.
Avec l'introduction de ConstraintLayout, vous pouvez résoudre votre problème sans LinearLayout imbriqué. Vous collez simplement deux repères verticaux avec des marges de 15% et 85% et placez vos boutons entre eux.
Voici le code source de la mise en page:
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
Android:layout_height="match_parent"
Android:layout_width="match_parent">
<TextView
Android:id="@+id/userVersionTextViewNew"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textSize="15sp"
Android:text="userVersionTextViewNew"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/userSoftSerialNumberTextView"
app:layout_constraintVertical_chainStyle="packed" />
<TextView
Android:id="@+id/userSoftSerialNumberTextView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textSize="15sp"
Android:text="userSoftSerialNumberTextView"
app:layout_constraintTop_toBottomOf="@+id/userVersionTextViewNew"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/imageView" />
<ImageView
Android:id="@+id/imageView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/logo_200"
app:layout_constraintTop_toBottomOf="@+id/userSoftSerialNumberTextView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/dummyTextView" />
<TextView
Android:id="@+id/dummyTextView"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textSize="15sp"
Android:text="dummyTextView"
app:layout_constraintTop_toBottomOf="@+id/imageView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintBottom_toTopOf="@+id/loginButton" />
<Button
Android:id="@+id/loginButton"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:text="Σύνδεση"
app:layout_constraintTop_toBottomOf="@+id/dummyTextView"
app:layout_constraintLeft_toLeftOf="@+id/leftGuideline"
app:layout_constraintRight_toLeftOf="@+id/rightGuideline"
app:layout_constraintBottom_toTopOf="@+id/demoLoginButton" />
<Button
Android:id="@+id/demoLoginButton"
Android:layout_width="0dp"
Android:layout_height="wrap_content"
Android:text="Δοκιμαστική χρήση"
app:layout_constraintTop_toBottomOf="@+id/loginButton"
app:layout_constraintLeft_toLeftOf="@+id/leftGuideline"
app:layout_constraintRight_toLeftOf="@+id/rightGuideline"
app:layout_constraintBottom_toBottomOf="parent" />
<Android.support.constraint.Guideline
Android:id="@+id/leftGuideline"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical"
app:layout_constraintGuide_percent="0.15" />
<Android.support.constraint.Guideline
Android:id="@+id/rightGuideline"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:orientation="vertical"
app:layout_constraintGuide_percent="0.85" />
</Android.support.constraint.ConstraintLayout>
En conséquence, vous obtenez cette vue:
Vous trouverez plus de détails dans Construire des interfaces avec ConstraintLayout .