Poids de la disposition Android

84

Je suis nouveau dans le développement Android et j'ai une question sur la définition du poids dans une mise en page linéaire.

J'essaie de créer une ligne avec deux boutons personnalisés et un texte d'édition personnalisé. Le texte d'édition ne doit prendre que la place de son contenu et les deux boutons doivent s'étendre horizontalement pour remplir le reste de l'espace disponible dans la ligne. Comme ça...

| [#Button++#] [#Button--#] [et] |

Après plusieurs tentatives, c'est le plus proche de ce que je veux, même si cela semble trop compliqué.

| [Button] [Button] [###ET###] |

<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal|center_vertical"
    android:layout_weight="1"
    >

    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_plus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_plus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/tv_dice_plus" 
                android:text="@string/tv_plus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <RelativeLayout 
            android:id="@+id/btn_minus_container" 
            android:layout_width="fill_parent" 
            android:layout_height="wrap_content"
            >
            <ImageButton 
                android:layout_height="wrap_content"
                android:layout_width="fill_parent" 
                android:id="@+id/btn_minus" 
                android:background="@drawable/btn"
                android:layout_centerInParent="true"
                ></ImageButton>
            <TextView 
                android:textColor="#FAFAF4"
                android:id="@+id/btn_minus" 
                android:text="@string/tv_minus" 
                android:layout_width="wrap_content" 
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                ></TextView>
        </RelativeLayout>
    </LinearLayout>
    <LinearLayout 
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center_horizontal|center_vertical"
        >
        <EditText 
            android:textColor="#FAFAF4"
            android:text="@string/et_output" 
            android:id="@+id/et_output" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:inputType="number"
            android:selectAllOnFocus="true" 
            android:minWidth="50sp"         
            android:maxWidth="50sp"
            android:background="@drawable/tv_black_background3"
            android:textColorHighlight="#c30505"
            ></EditText>
    </LinearLayout>
</LinearLayout>

D'après ce que je comprends, le réglage [android: layout_weight = "2"] pour les mises en page linéaires en maintenant les boutons devrait les faire prendre plus de place que le texte d'édition, mais cela fait le contraire pour moi, en les faisant tous les deux de moitié.

| [Btn] [Btn] [#####et#####] |

J'ai essayé tellement de combinaisons différentes que je ne m'en souviens même pas, et aucune n'a fonctionné.

MalchanceuxDevil
la source

Réponses:

213

Cela ne fonctionne pas car vous utilisez fill_parent comme largeur. Le poids est utilisé pour répartir l'espace vide restant ou pour emporter de l'espace lorsque la somme totale est supérieure à LinearLayout. Réglez vos largeurs sur 0dip à la place et cela fonctionnera.

Romain Guy
la source
6
Définir les largeurs sur les mises en page linéaires à 0dip a fonctionné comme je le voulais. Je ne savais pas que c'était une option. Il est logique que cela fonctionne là où wrap_content ne le ferait pas. Définir la largeur sur wrap_content lorsqu'il n'y a pas de contenu le fait disparaître, mais le définir sur 0dip lui permet de s'étirer de rien à la taille nécessaire. Merci beaucoup.
UnluckyDevil
Définir layout_width sur "fill_parent" et layout_weight sur une valeur flottante comme "0.2", "0.85" etc. fonctionne également. Dans ce cas, plus le nombre est élevé, plus la taille de la vue sera petite. pourriez-vous s'il vous plaît expliquer si c'est une façon acceptable de le faire?
Yar le
37
Cela a fonctionné pour moi aussi. Merci. (Bien que je
doive
Merci! J'ai vraiment eu du mal à dire pourquoi les largeurs de ma disposition ne s'affichaient pas comme prévu. C'est le réglage 0dip qui l'a fait :)
marlar
@tstyle android est facile si vous voulez faire des choses faciles. Cependant, si vous voulez faire plus que des choses faciles, cela devient trop difficile.
Pacerier
14

android:Layout_weightpeut être utilisé lorsque vous n'attachez pas de valeur fixe à votre largeur, comme fill_parentetc.

Faites quelque chose comme ceci:

<Button>

Android:layout_width="0dp"
Android:layout_weight=1

-----other parameters
</Button>
learn_andrd
la source
7

Pensez-le de cette façon, ce sera plus simple

Si vous avez 3 boutons et que leur poids est de 1,3,1 en conséquence, cela fonctionnera comme un tableau en HTML

Prévoyez 5 portions pour cette ligne: 1 portion pour le bouton 1, 3 portions pour le bouton 2 et 1 portion pour le bouton 1

George Nguyen
la source
3

Dans le linearLayout, définissez WeightSum = 2;

Et distribuez le poids à ses enfants comme vous le souhaitez. J'ai donné un poids = "1" à l'enfant. Ainsi, les deux distribueront la moitié du total.

 <LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="2"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:src="@drawable/maila_oss" />
</LinearLayout>
AndroidGeek
la source
2

les valeurs de poids 0-1 partagent la distribution de l'espace disponible (après avoir défini layout_width = "0px") proportionnellement à la valeur de poids. Les éléments d'affichage dont le poids n'est pas spécifié (aucune entrée de poids) ont un poids de 0, ce qui signifie qu'ils n'obtiennent aucune expansion.

Une alternative simple sans entrées de poids nécessaires consiste à attacher un chapiteau à une vue avec du texte qui lui indique de s'étendre du minimum nécessaire pour le texte (wrap_content) à l'espace disponible EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"

JDPearlman
la source
0

Je suppose que définir la EditTextlargeur s sur wrap_contentet placer les deux boutons dans un LinearLayoutdont la largeur fill_parentet le poids sont définis sur 1.

Jonathan Roth
la source
0

Une raison de plus que j'ai trouvée (aussi vague que cela puisse paraître). Le ci-dessous n'a pas fonctionné.

LinearLayout vertical

LinearLayout hauteur fillparent + poids

LinearLayout hauteur fillparent + poids

LinearLayout hauteur fillparent + poids

EndLinearLayout

Ce qui a fonctionné était

Disposition relative

LinearLayout vertical

LinearLayout hauteur fillparent + poids

LinearLayout hauteur fillparent + poids

LinearLayout hauteur fillparent + poids

EndLinearLayout

EndRelativeLayout

Cela semble vague par une disposition de racine avec Linear et les poids en dessous ne fonctionnaient pas. Et quand je dis "n'a pas fonctionné", je veux dire, qu'après avoir vu la disposition graphique entre différentes résolutions, la cohérence de l'écran s'est cassée énormément.

Siddharth
la source
0
<LinearLayout
    android:id="@+id/linear1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="9"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/ring_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/ring_oss" />

    <ImageView
        android:id="@+id/maila_oss"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
<EditText
        android:id="@+id/edittxt"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:src="@drawable/maila_oss" />
</LinearLayout>
Devendra Shah
la source