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.

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.


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>

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


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>

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"


0

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


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.


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>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.