Peso layout Android


84

Sono nuovo nello sviluppo di Android e ho una domanda sull'impostazione del peso in un layout lineare.

Sto cercando di creare una riga con due pulsanti personalizzati e un testo di modifica personalizzato. Il testo di modifica dovrebbe occupare solo lo spazio del suo contenuto, ei due pulsanti dovrebbero espandersi orizzontalmente per riempire il resto dello spazio disponibile nella riga. Come questo...

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

Dopo diversi tentativi questo è quanto di più vicino posso ottenere a ciò che voglio, anche se sembra eccessivamente complicato.

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

Da quanto ho capito, l'impostazione [android: layout_weight = "2"] per i layout lineari tenendo premuti i pulsanti dovrebbe farli occupare più spazio del testo di modifica, ma per me fa il contrario, rendendoli entrambi la metà delle dimensioni.

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

Ho provato così tante combinazioni diverse che non riesco nemmeno a ricordarle, e nessuna ha funzionato.

Risposte:


213

Non funziona perché stai usando fill_parent come larghezza. Il peso viene utilizzato per distribuire lo spazio vuoto rimanente o per sottrarre spazio quando la somma totale è maggiore del LinearLayout. Imposta invece le tue larghezze su 0dip e funzionerà.


6
L'impostazione delle larghezze sui layout lineari su 0dip ha funzionato come volevo. Non sapevo che fosse un'opzione. Ha senso perché funzioni dove wrap_content no. Impostare la larghezza su wrap_content quando non c'è contenuto lo fa scomparire, ma impostarlo su 0dip gli consente di estendersi dal nulla a quanto grande deve essere. Grazie mille.
UnluckyDevil

Anche l'impostazione di layout_width su "fill_parent" e layout_weight su un valore float come "0.2", "0.85" ecc. Funziona. In questo caso, maggiore è il numero, minore sarà la dimensione della vista. potresti spiegare se questo è un modo accettabile per farlo?
Yar

37
Questo ha funzionato anche per me. Grazie. (Anche se devo dire, qualcun altro trova il sistema di layout Android strano e poco intuitivo?)
tstyle

Grazie! Ho davvero avuto problemi a spiegare perché le mie larghezze di layout non venivano visualizzate come previsto. È stata l'impostazione 0dip a farlo :)
marlar

@tstyle android è facile se vuoi fare cose facili. Tuttavia, se vuoi fare cose più che semplici, diventa eccessivamente difficile.
Pacerier

14

android:Layout_weightpuò essere utilizzato quando non si collega un valore fisso alla larghezza già come fill_parentecc.

Fai qualcosa di simile:

<Button>

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

-----other parameters
</Button>

7

Pensala in questo modo, sarà più semplice

Se hai 3 pulsanti e il loro peso è 1,3,1 di conseguenza, funzionerà come una tabella in HTML

Fornire 5 porzioni per quella linea: 1 porzione per il pulsante 1, 3 porzioni per il pulsante 2 e 1 porzione per il pulsante 1


3

In linearLayout impostare WeightSum = 2;

E distribuisci il peso ai suoi figli come vuoi che vengano visualizzati .. Ho dato peso = "1" al bambino. Quindi entrambi distribuiranno la metà del totale.

 <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

i valori di peso 0-1 condividono la distribuzione dello spazio disponibile (dopo aver impostato layout_width = "0px") in proporzione al valore del peso. Gli elementi di visualizzazione con peso non specificato (nessuna voce di peso) ottengono il peso 0, il che significa che non ottengono espansione.

Una semplice alternativa senza voci di peso necessarie è allegare un riquadro di selezione a una vista con testo che gli comunichi di espandersi dal minimo necessario per il testo (wrap_content) allo spazio disponibile EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"


0

Suppongo di impostare la EditTextlarghezza s su wrap_contente mettere i due pulsanti in un la LinearLayoutcui larghezza è fill_parente il peso è impostato su 1.


0

Un motivo in più che ho trovato (per quanto possa sembrare vago). Quanto segue non ha funzionato.

LinearLayout verticale

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

EndLinearLayout

Quello che ha funzionato è stato

RelativeLayout

LinearLayout verticale

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

LinearLayout height fillparent + weight

EndLinearLayout

EndRelativeLayout

Sembra vago da un layout di radice con Linear e i pesi sotto di esso non hanno funzionato. E quando dico "non ha funzionato", intendo che dopo aver visto il layout grafico tra le varie risoluzioni la coerenza dello schermo si è interrotta alla grande.


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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.