Layout linear e peso no Android

262

Eu sempre leio sobre esse valor de peso engraçado nas documentações do Android. Agora quero experimentá-lo pela primeira vez, mas não está funcionando.

Pelo que entendi das documentações deste layout:

  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="10dip"
        weight="1" />

  </LinearLayout>

deve criar dois botões alinhados horizontalmente e compartilhar o espaço igualmente. O problema é que os dois botões não crescem para preencher o espaço.

Eu gostaria que os botões crescessem e preenchessem toda a linha. Se os dois botões estiverem configurados para corresponder aos pais, apenas o primeiro botão será exibido e preencherá a linha inteira.

Janusz
fonte
update: o suporte percentual do android também pode fazer isso muito bem. code2concept.blogspot.in/2015/08/...
nitesh

Respostas:

160

Você não está definindo a layout_weightpropriedade. Seu código lê weight="1"e deve ler android:layout_weight="1".

JeremyFromEarth
fonte
684

3 coisas para lembrar:

  • defina o android: layout_width dos filhos como "0dp"
  • defina android: weightSum do pai ( edite: como Jason Moore notou, esse atributo é opcional, porque por padrão é definido como a soma do layout_weight da criança)
  • defina o android: layout_weight de cada filho proporcionalmente (por exemplo, weightSum = "5", três filhos: layout_weight = "1", layout_weight = "3", layout_weight = "1")

Exemplo:

    <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:weightSum="5">

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="1" />

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="2" />

    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="3" />

    </LinearLayout>

E o resultado:

Exemplo de peso do layout

Anke
fonte
66
Obrigado pela dica sobre como definir a largura como zero. Também descobri que não era necessário definir o weightSum no pai.
Jason Moore
30
É bom saber, obrigado. Nesse caso, definir o weightSum ainda pode ser útil quando você não deseja que os filhos preencham 100% do pai.
Anke
13
Isso está correto para layouts XML estáticos. Se você estiver adicionando Views dinamicamente em tempo de execução, precisará usar o addView com parâmetros de layout como addView(button, new LinearLayout.LayoutParams(0, height, 1));Isso é verdade mesmo se você estiver inflando layouts com os valores corretos de largura e peso.
Nuthatch
Você diz definir o android: weightSum do pai - defina-o com algum valor ou apenas coloque-o, como isso deve ser definido?
theJerm 18/10/12
1
@batbrat está correto, eu estava gerando interface do usuário dinamicamente. Às vezes, trato fragmentos XML como modelos e modifico ou preenche em tempo de execução. Esse truque não funcionou para mim, neste caso, tive que redefinir a largura e o peso explícitos para fazê-lo funcionar.
Nuthatch
52

É android:layout_weight. O peso só pode ser usado em LinearLayout. Se a orientação do layout linear for Vertical, use android:layout_height="0dp"e, se a orientação for horizontal, use android:layout_width = "0dp". Funcionará perfeitamente.

Manoj Seelan
fonte
16

Tente definir os layout_widthdois botões para "0dip" e os weightdois botões para0.5

jqpubliq
fonte
Agora os dois botões são desapareceu da tela
Janusz
bem, em seguida, definir a largura de esquema em ambos para fill_parent e pesos para 0,5
jqpubliq
dê uma olhada nisso e isso . Estou um pouco confuso sobre por que isso ainda não está funcionando, mas talvez isso lhe dê algumas idéias.
precisa saber é o seguinte
7

O LinearLayout suporta a atribuição de um peso a filhos individuais. Este atributo atribui um valor de " importância " a uma visualização e permite a expansão para preencher qualquer espaço restante na visualização pai. O peso padrão é zero

cálculo para atribuir qualquer espaço restante / extra entre filhos. (não o espaço total)

espaço atribuído à criança = (peso individual da criança) / (soma do peso de cada criança no Layout Linear)

Exemplo (1): se houver três caixas de texto e duas declararem peso 1, enquanto a terceira não tiver peso (0), o espaço restante / extra será atribuído a

1st text box = 1/(1+1+0) 
2nd text box = 1/(1+1+0) 
3rd text box = 0/(1+1+0) 

Exemplo (2) : digamos que temos um rótulo de texto e dois elementos de edição de texto em uma linha horizontal. O rótulo não possui layout_weight especificado, portanto, ocupa o espaço mínimo necessário para renderizar. Se o layout_weight de cada um dos dois elementos de edição de texto estiver definido como 1, a largura restante no layout pai será dividida igualmente entre eles (porque alegamos que são igualmente importantes).

calculation : 
1st label = 0/(0+1+1) 
2nd text box = 1/(0+1+1) 
3rd text box = 1/(0+1+1)

Se a primeira caixa de texto tiver um layout_weight de 1 e a segunda caixa de texto tiver um layout_weight de 2, um terço do espaço restante será atribuído à primeira e dois terços ao segundo (porque afirmamos que a segunda é mais importante).

calculation : 
1st label = 0/(0+1+2) 
2nd text box = 1/(0+1+2) 
3rd text box = 2/(0+1+2) 
Rakesh Soni
fonte
7

No campo largura do botão, substitua wrap-contentpor 0dp.
Use o atributo layout_weight de uma visualização.

android:layout_width="0dp"  

É assim que seu código ficará:

<LinearLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content"
 android:orientation="horizontal">

 <Button
    android:text="Register"
    android:id="@+id/register"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />

 <Button
    android:text="Not this time"
    android:id="@+id/cancel"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:layout_weight="1" />    

</LinearLayout>

layout_weight é usado para distribuir o espaço restante em proporções. Nesse caso, os dois botões estão usando a largura "0dp". Portanto, o espaço restante será dividido em uma proporção de 1: 1 entre eles, ou seja, o espaço será dividido igualmente entre as vistas de botão.

Goblin verde
fonte
6

Como resposta de @Manoj Seelan

Substituir android:layout_weightCom android:weight.

Quando você usa Peso com LinearLayout. você deve adicionar weightSumem LinearLayoute de acordo com a orientação do seu LinearLayoutvocê deve definir 0dppara largura / altura a todos LinearLayout`s vistas Crianças

Exemplo:

Se a orientação de Linearlayoutfor Vertical, defina a largura de todas LinearLayoutas visualizações filhos com0dp

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="vertical"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>

Se a orientação Linearlayoutde for horizontal, Defina a altura de todas LinearLayoutas visualizações filhos com 0dp.

 <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:weightSum="3">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="2" />

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:padding="10dip"
        android:layout_weight="1" />

  </LinearLayout>
ahmed hamdy
fonte
5

Talvez definir as duas propriedades de layout_width dos botões como "fill_parent" ajude.

Acabei de testar esse código e ele funciona no emulador:

<LinearLayout android:layout_width="fill_parent"
          android:layout_height="wrap_content">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="hello world"/>

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="goodbye world"/>

</LinearLayout>

Defina layout_width como "fill_parent" nos dois botões.

JeremyFromEarth
fonte
1
isso apenas empurra o botão direito para fora da tela e mostra apenas o primeiro botão.
Janusz
4
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/logonFormButtons"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:baselineAligned="true"       
        android:orientation="horizontal">

        <Button
            android:id="@+id/logonFormBTLogon"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/logon"
            android:layout_weight="0.5" />

        <Button
            android:id="@+id/logonFormBTCancel"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"            
            android:text="@string/cancel"
            android:layout_weight="0.5" />
    </LinearLayout>
Yar
fonte
Agora eu prefiro sugerir o uso de layout_weight = "50" e layout_width = "0px"
Yar
2

No XML acima, defina o android:layout_weightlayout linear como 2: android:layout_weight="2"

Priyanka
fonte
3
Por que isso é necessário? Por que o peso do layout de 2 é importante? Por que não 20 ou 200?
Conrad Frix
2

Além disso, você precisa adicionar isso android:layout_width="0dp"para visualizações de crianças [visualizações de botão] deLinerLayout

Rebeka
fonte
2

Você tem que escrever assim está trabalhando pra mim

<LinearLayout
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:orientation="horizontal"
            android:weightSum="2">

         <Button
            android:text="Register"
            android:id="@+id/register"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />

         <Button
            android:text="Not this time"
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dip"
            android:layout_weight="1" />
Dinesh Saini
fonte
2

Abaixo estão as alterações (marcadas em negrito ) no seu código:

<LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal">

     <Button
        android:text="Register"
        android:id="@+id/register"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

     <Button
        android:text="Not this time"
        android:id="@+id/cancel"
        android:layout_width="0dp" //changes made here
        android:layout_height="wrap_content"
        android:padding="10dip"
        android:layout_weight="1" /> //changes made here

  </LinearLayout>

Como o LinearLayout tem orientação na horizontal, você precisará manter a largura apenas como 0dp. para usar pesos nessa direção. (Se sua orientação fosse vertical, você manteria sua altura apenas 0dp) .

Como existem duas visualizações e você as colocou android:layout_weight="1"nas duas, significa que as duas serão divididas igualmente na direção horizontal (ou pela largura).

Akshay Chopra
fonte
1
 <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 1" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="Button 2" />

    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="Button 3" />

    </LinearLayout>
Katrina Khan
fonte
0

Esta é a resposta perfeita do seu problema

  <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content"
        android:orientation="horizontal"  >   
     <Button 
        android:text="Register" android:id="@+id/register"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
     <Button 
        android:text="Not this time" android:id="@+id/cancel"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:padding="10dip" weight="1" />
  </LinearLayout>
Rahul Mandaliya
fonte
3
Então é "peso" ou "layout_weight" ??
IgorGanapolsky
É android: layout_weight
Mahendra Gunawardena
0

Substitua wrap_contentpor fill_parent.

Humberto Pinheiro
fonte
0
 <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center"
            android:background="#008">

            <RelativeLayout
                android:id="@+id/paneltamrin"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"

                >
                <Button
                    android:id="@+id/BtnT1"
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                    android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />
            </RelativeLayout>

            <RelativeLayout
                android:id="@+id/paneltamrin2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="150dp"
                     android:drawableTop="@android:drawable/ic_menu_edit"
                    android:drawablePadding="6dp"
                    android:padding="15dp"
                    android:text="AndroidDhina"
                    android:textColor="#000"
                    android:textStyle="bold" />

            </RelativeLayout>
        </LinearLayout>

insira a descrição da imagem aqui

سیدرسول میرعظیمی
fonte