Peso do layout Android

84

Eu sou novo no desenvolvimento do Android e tenho uma dúvida sobre como definir o peso em um layout linear.

Estou tentando criar uma linha com dois botões personalizados e um texto de edição personalizado. O texto de edição deve ocupar tanto espaço quanto seu conteúdo, e os dois botões devem se expandir horizontalmente para preencher o restante do espaço disponível na linha. Como isso...

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

Depois de várias tentativas, isso é o mais perto que posso chegar do que quero, embora pareça muito complicado.

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

Pelo que entendi, definir [android: layout_weight = "2"] para os layouts lineares que prendem os botões deve fazer com que ocupem mais espaço do que o texto de edição, mas faz o oposto para mim, fazendo com que ambos tenham metade do tamanho.

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

Eu tentei tantas combinações diferentes que nem consigo me lembrar delas, e nenhuma funcionou.

UnluckyDevil
fonte

Respostas:

213

Não funciona porque você está usando fill_parent como largura. O peso é usado para distribuir o espaço vazio restante ou tirar espaço quando a soma total for maior do que LinearLayout. Em vez disso, defina suas larguras como 0dip e funcionará.

Romain Guy
fonte
6
Definir as larguras nos layouts lineares para 0dip funcionou como eu queria. Eu não sabia que isso era uma opção. Faz sentido porque isso funcionaria onde wrap_content não. Definir a largura como wrap_content quando não há conteúdo faz com que ele desapareça, mas defini-la como 0dip permite esticar do nada para o tamanho que precisa ser. Muito obrigado.
UnluckyDevil de
Definir layout_width como "fill_parent" e layout_weight como um valor flutuante como "0,2", "0,85" etc. também funciona. Neste caso, quanto maior for o número, menor será o tamanho da vista. você poderia explicar se essa é uma maneira aceitável de fazer isso?
Yar
37
Isso funcionou para mim também. Obrigado. (Embora eu deva dizer, alguém mais acha o sistema de layout do Android estranho e não intuitivo?)
tstyle
Obrigado! Eu realmente tive problemas em dizer por que minhas larguras de layout não apareceram conforme o esperado. Foi a configuração 0dip que fez isso :)
marlar
@tstyle android é fácil se você quiser fazer coisas fáceis. No entanto, se você quiser fazer mais do que coisas fáceis, torna-se muito difícil.
Pacerier
14

android:Layout_weightpode ser usado quando você não atribui um valor fixo à sua largura, como fill_parentetc.

Faça algo assim:

<Button>

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

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

Pense assim, será mais simples

Se você tiver 3 botões e seus pesos forem 1,3,1 de acordo, funcionará como uma tabela em HTML

Forneça 5 porções para essa linha: 1 porção para o botão 1, 3 porções para o botão 2 e 1 porção para o botão 1

George Nguyen
fonte
3

No linearLayout, defina WeightSum = 2;

E distribua o peso para seus filhos como você quer que eles exibam. Eu dei peso = "1" para a criança. Então, ambos distribuirão metade do 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
fonte
2

valores de peso 0-1 compartilham a distribuição do espaço disponível (após definir layout_width = "0px") em proporção ao valor do peso. Elementos de visualização com peso não especificado (sem entrada de peso) obtêm peso 0, o que significa que eles não obtêm expansão.

Uma alternativa simples, sem a necessidade de entradas de peso, é anexar um letreiro a uma visualização com texto que diga para expandir do mínimo necessário para o texto (wrap_content) até o espaço disponível EditText: android: layout_width = "wrap_content" android: ellipsize = "marquee"

JDPearlman
fonte
0

suponho que definir a EditTextlargura s para wrap_contente colocar os dois botões em um LinearLayoutcuja largura é fill_parente peso definido como 1.

Jonathan Roth
fonte
0

Mais uma razão que encontrei (por mais vaga que possa parecer). O abaixo não funcionou.

LinearLayout vertical

LinearLayout altura fillparent + weight

LinearLayout altura fillparent + weight

LinearLayout altura fillparent + weight

EndLinearLayout

O que funcionou foi

Esquema relativo

LinearLayout vertical

LinearLayout altura fillparent + weight

LinearLayout altura fillparent + weight

LinearLayout altura fillparent + weight

EndLinearLayout

EndRelativeLayout

Parece vago por um layout de raiz com Linear e pesos abaixo dele não funcionou. E quando digo "não funcionou", quero dizer, que depois de ver o layout gráfico entre várias resoluções a consistência da tela quebrou em grande.

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