Waga układu Androida

84

Jestem nowy w programowaniu na Androida i mam pytanie dotyczące ustawiania wagi w układzie liniowym.

Próbuję utworzyć wiersz z dwoma niestandardowymi przyciskami i niestandardowym tekstem edycji. Tekst do edycji powinien zajmować tyle miejsca, ile jego zawartość, a dwa przyciski powinny rozszerzyć się w poziomie, aby wypełnić resztę dostępnego miejsca w wierszu. Lubię to...

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

Po kilku próbach jest to najbliższe mi osiągnięcie tego, czego chcę, nawet jeśli wydaje się to zbyt skomplikowane.

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

Jak rozumiem, ustawienie [android: layout_weight = "2"] dla układów liniowych przytrzymujących przyciski powinno sprawić, że zajmą więcej miejsca niż tekst edycji, ale dla mnie robi to odwrotnie, dzięki czemu oba są o połowę mniejsze.

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

Próbowałem tak wielu różnych kombinacji, że nawet ich nie pamiętam i żadna nie zadziałała.

UnluckyDevil
źródło

Odpowiedzi:

213

To nie działa, ponieważ używasz fill_parent jako szerokości. Waga jest używana do rozłożenia pozostałej pustej przestrzeni lub zabrania miejsca, gdy całkowita suma jest większa niż LinearLayout. Zamiast tego ustaw szerokość na 0dip i zadziała.

Romain Guy
źródło
6
Ustawienie szerokości w układach liniowych na 0dip działało tak, jak chciałem. Nie wiedziałem, że to opcja. Ma sens, dlaczego to działałoby tam, gdzie nie byłoby wrap_content. Ustawienie szerokości na wrap_content, gdy nie ma zawartości, powoduje jej zniknięcie, ale ustawienie jej na 0dip umożliwia rozciągnięcie od zera do tak dużego, jak to konieczne. Dziękuję Ci bardzo.
UnluckyDevil
Ustawienie layout_width na „fill_parent” i layout_weight na wartość float, np. „0.2”, „0.85” itp. Również działa. W tym przypadku im większa liczba, tym mniejszy rozmiar zajmie widok. czy mógłbyś wyjaśnić, czy jest to akceptowalny sposób, aby to zrobić?
Yar
37
To zadziałało również dla mnie. Dziękuję Ci. (Chociaż muszę powiedzieć, czy ktoś inny uważa system układu Androida za dziwny i nieintuicyjny?)
tstyle
Dzięki! Naprawdę miałem problemy ze stwierdzeniem, dlaczego szerokości mojego układu nie są zgodne z oczekiwaniami. Zrobiło to ustawienie 0dip :)
marlar
@tstyle android jest łatwy, jeśli chcesz robić proste rzeczy. Jeśli jednak chcesz zrobić coś więcej niż proste rzeczy, staje się to zbyt trudne.
Pacerier,
14

android:Layout_weightmoże być używany, gdy nie dołączasz już stałej wartości do swojej szerokości, jak fill_parentitp.

Zrób coś takiego:

<Button>

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

-----other parameters
</Button>
learn_andrd
źródło
7

Pomyśl w ten sposób, będzie prostsze

Jeśli masz 3 przyciski i ich waga wynosi odpowiednio 1,3,1, będzie działać jak tabela w HTML

Zapewnij 5 porcji dla tej linii: 1 porcja na przycisk 1, 3 porcje na przycisk 2 i 1 porcja na przycisk 1

George Nguyen
źródło
3

W linearLayout ustaw WeightSum = 2;

I rozłóż ciężar na jego dzieci, tak jak chcesz, aby je wyświetlały. Dałem dziecku wagę = "1". Tak więc oboje rozdzielą połowę całości.

 <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
źródło
2

wartości wagi 0-1 dzielą rozkład dostępnej przestrzeni (po ustawieniu layout_width = "0px") proporcjonalnie do wartości wagi. Widok elementów o nieokreślonej wadze (bez wpisu wagi) uzyskuje wagę 0, co oznacza, że ​​nie rozwijają się.

Prostą alternatywą, która nie wymaga wpisów wagi, jest dołączenie markizy do widoku z tekstem, który mówi mu, aby rozszerzał się od minimum wymaganego dla tekstu (wrap_content) do dostępnego miejsca EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"

JDPearlman
źródło
0

przypuszczam, że ustawiam EditTextszerokość s na wrap_contenti umieszczam dwa przyciski w a, LinearLayoutktórego szerokość fill_parenti waga są ustawione na 1.

Jonathan Roth
źródło
0

Znalazłem jeszcze jeden powód (choć może się to wydawać niejasne). Poniższe nie działa.

Układ liniowy w pionie

Wysokość LinearLayout fillparent + weight

Wysokość LinearLayout fillparent + weight

Wysokość LinearLayout fillparent + weight

EndLinearLayout

Co zadziałało

RelativeLayout

Układ liniowy w pionie

Wysokość LinearLayout fillparent + weight

Wysokość LinearLayout fillparent + weight

Wysokość LinearLayout fillparent + weight

EndLinearLayout

EndRelativeLayout

Brzmi niejasno przez układ główny z Linear i wagi pod nim nie działały. A kiedy mówię „nie zadziałało” mam na myśli to, że po obejrzeniu układu graficznego pomiędzy różnymi rozdzielczościami, spójność ekranu bardzo się zepsuła.

Siddharth
źródło
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
źródło