Android Layout Gewicht

84

Ich bin neu in der Android-Entwicklung und habe eine Frage zum Festlegen des Gewichts in einem linearen Layout.

Ich versuche, eine Zeile mit zwei benutzerdefinierten Schaltflächen und einem benutzerdefinierten Bearbeitungstext zu erstellen. Der Bearbeitungstext sollte nur so viel Platz einnehmen wie sein Inhalt, und die beiden Schaltflächen sollten horizontal erweitert werden, um den Rest des verfügbaren Platzes in der Zeile auszufüllen. So was...

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

Nach mehreren Versuchen ist dies das Beste, was ich erreichen kann, obwohl es zu kompliziert erscheint.

| [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>

Soweit ich weiß, sollte die Einstellung [android: layout_weight = "2"] für die linearen Layouts, in denen sich die Schaltflächen befinden, mehr Platz beanspruchen als der Bearbeitungstext, aber für mich ist das Gegenteil der Fall, da beide die halbe Größe haben.

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

Ich habe so viele verschiedene Kombinationen ausprobiert, dass ich mich nicht einmal an sie erinnern kann, und keine hat funktioniert.

Unglücklicher Teufel
quelle

Antworten:

213

Es funktioniert nicht, weil Sie fill_parent als Breite verwenden. Das Gewicht wird verwendet, um den verbleibenden leeren Raum zu verteilen oder Platz wegzunehmen, wenn die Gesamtsumme größer als das LinearLayout ist. Stellen Sie stattdessen Ihre Breite auf 0dip ein und es wird funktionieren.

Romain Guy
quelle
6
Das Einstellen der Breiten in den linearen Layouts auf 0dip funktionierte wie gewünscht. Ich wusste nicht, dass das eine Option ist. Es ist sinnvoll, warum dies funktionieren würde, wo wrap_content dies nicht tun würde. Wenn Sie die Breite auf wrap_content setzen, wenn kein Inhalt vorhanden ist, wird sie ausgeblendet. Wenn Sie sie jedoch auf 0dip setzen, kann sie sich von nichts auf die Größe erstrecken, die sie benötigt. Vielen Dank.
UnluckyDevil
Das Setzen von layout_width auf "fill_parent" und layout_weight auf einen Float-Wert wie "0.2", "0.85" usw. funktioniert ebenfalls. In diesem Fall ist die Ansicht umso kleiner, je größer die Zahl ist. Könnten Sie bitte erklären, ob dies ein akzeptabler Weg ist?
Yar
37
Das hat auch bei mir funktioniert. Danke dir. (Obwohl ich sagen muss, findet jemand anderes das Android-Layout-System seltsam und nicht intuitiv?)
Stil
Vielen Dank! Ich hatte wirklich Probleme zu sagen, warum meine Layoutbreiten nicht wie erwartet angezeigt wurden. Es war die 0dip-Einstellung, die es tat :)
Marlar
@tstyle android ist einfach, wenn Sie einfache Dinge tun möchten. Wenn Sie jedoch mehr als nur einfache Dinge tun möchten , wird es zu schwierig.
Pacerier
14

android:Layout_weightkann verwendet werden, wenn Sie Ihrer Breite noch keinen festen Wert hinzufügen, wie fill_parentusw.

Mach so etwas:

<Button>

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

-----other parameters
</Button>
learn_andrd
quelle
7

Denken Sie es so, wird einfacher sein

Wenn Sie 3 Schaltflächen haben und deren Gewichtung dementsprechend 1,3,1 beträgt, funktioniert dies wie eine Tabelle in HTML

Geben Sie 5 Portionen für diese Zeile an: 1 Portion für Taste 1, 3 Portionen für Taste 2 und 1 Portion für Taste 1

George Nguyen
quelle
3

Setzen Sie im linearLayout die WeightSum = 2;

Und verteilen Sie das Gewicht auf die Kinder, wie Sie es anzeigen möchten. Ich habe dem Kind das Gewicht = "1" gegeben. Beide verteilen also die Hälfte der Gesamtsumme.

 <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
quelle
2

Gewichtswerte 0-1 teilen die Verteilung des verfügbaren Speicherplatzes (nach Festlegen von layout_width = "0px") proportional zum Gewichtswert. Ansichtselemente mit nicht angegebenem Gewicht (kein Gewichtseintrag) erhalten das Gewicht 0, was bedeutet, dass sie keine Erweiterung erhalten.

Eine einfache Alternative, bei der keine Gewichtseinträge erforderlich sind, besteht darin, ein Laufschriftzeichen an eine Ansicht mit Text anzuhängen, in der angegeben wird, dass das für den Text erforderliche Minimum (wrap_content) auf den verfügbaren Speicherplatz erweitert werden soll. EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"

JDPearlman
quelle
0

Ich würde annehmen, die EditTextBreite s auf zu wrap_contentsetzen und die beiden Knöpfe in eine zu setzen, LinearLayoutderen Breite fill_parentund Gewicht auf 1 gesetzt sind.

Jonathan Roth
quelle
0

Ein weiterer Grund, den ich gefunden habe (vage, wie es sich anhört). Das Folgende hat nicht funktioniert.

LinearLayout vertikal

LinearLayout Höhe Füllelement + Gewicht

LinearLayout Höhe Füllelement + Gewicht

LinearLayout Höhe Füllelement + Gewicht

EndLinearLayout

Was funktionierte war

RelativeLayout

LinearLayout vertikal

LinearLayout Höhe Füllelement + Gewicht

LinearLayout Höhe Füllelement + Gewicht

LinearLayout Höhe Füllelement + Gewicht

EndLinearLayout

EndRelativeLayout

Es klingt vage durch ein Root-Layout mit linearen und Gewichten darunter hat nicht funktioniert. Und wenn ich sage "hat nicht funktioniert", meine ich, dass die Bildschirmkonsistenz nach dem Betrachten des grafischen Layouts zwischen verschiedenen Auflösungen stark beeinträchtigt wurde.

Siddharth
quelle
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
quelle