web-dev-qa-db-fra.com

Disposition relative Android avec la largeur du bouton avec le poids

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>
13
iCantSeeSharp

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>
14
chetanmoswal

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>
29
hcpl

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"
6
Venelin Gornishki

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>
6
Oleksandr

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.

1
Yashwanth Kumar

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" 

0
himanshu

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.

 Layout Editor

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:

 Result view

Vous trouverez plus de détails dans Construire des interfaces avec ConstraintLayout .

0
Eugene Brusov