Eu não entendo como usar esse atributo. Alguém pode me dizer mais sobre isso?
android
android-layout
android-widget
Mojiiz
fonte
fonte
Em poucas palavras,
layout_weight
especifica quanto do espaço extra no layout deve ser alocado para a Visualização.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 das visualizações é zero.
Cálculo para atribuir qualquer espaço restante entre filho
Em geral, a fórmula é:
Exemplo 1
Se houver três caixas de texto e duas declararem peso 1, enquanto o terceiro não tiver peso (0), o espaço restante será atribuído da seguinte maneira:
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 foi
layout_weight
especificado, portanto, ocupa o espaço mínimo necessário para renderizar. Selayout_weight
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).Cálculo:
Se, em vez disso, a primeira caixa de texto tiver um
layout_weight
de 1 e a segunda caixa de texto tiver umlayout_weight
de 2, um terço do espaço restante será atribuído à primeira e dois terços ao segundo (porque reivindicamos a segunda um é mais importante).Cálculo:
Artigo fonte
fonte
android:layout_width="0px"
é importante. Além disso, os pesos não precisam ser inteiros.weightSum
vem a imagem então? Tem algo a ver com issolayout_weight
?adicionando às outras respostas, a coisa mais importante para que isso funcione é definir a largura (ou altura) do layout como 0px
caso contrário, você verá lixo
fonte
Se houver várias visualizações abrangendo a
LinearLayout
,layout_weight
dê a cada uma delas um tamanho proporcional. Uma visualização com umlayout_weight
valor maior "pesa" mais, ficando com um espaço maior.Aqui está uma imagem para tornar as coisas mais claras.
Teoria
O termo peso do layout está relacionado ao conceito de média ponderada em matemática. É como em uma aula de faculdade, onde a lição de casa vale 30%, a frequência vale 10%, o meio termo vale 20% e a final vale 40%. Suas pontuações nessas partes, quando ponderadas juntas, dão a você a nota total.
É o mesmo para o peso do layout. O
Views
numa posição horizontalLinearLayout
pode tomar-se cada uma certa percentagem da largura total. (Ou uma porcentagem da altura para uma verticalLinearLayout
.)O layout
O
LinearLayout
que você usar será mais ou menos assim:Observe que você deve usar
layout_width="match_parent"
para oLinearLayout
. Se você usarwrap_content
, não funcionará. Observe também quelayout_weight
não funciona para as visualizações em RelativeLayouts (consulte aqui e aqui as respostas para SO que lidam com esse problema).As visualizações
Cada visualização em uma horizontal
LinearLayout
é mais ou menos assim:Observe que você precisa usar
layout_width="0dp"
junto comlayout_weight="1"
. Esquecer isso causa muitos problemas para novos usuários. (Consulte este artigo para obter resultados diferentes, não é possível definir a largura como 0.) Se suas visualizações estiverem na verticalLinearLayout
, você usarialayout_height="0dp"
, é claro.No
Button
exemplo acima, defino o peso como 1, mas você pode usar qualquer número. É apenas o total que importa. Você pode ver nas três linhas de botões na primeira imagem que eu publiquei, os números são todos diferentes, mas como as proporções são as mesmas, as larguras ponderadas não mudam em cada linha. Algumas pessoas gostam de usar números decimais com uma soma de 1, de modo que, em um layout complexo, fique claro qual é o peso de cada parte.Uma nota final. Se você tiver muitos layouts aninhados em uso
layout_weight
, isso pode prejudicar o desempenho.Extra
Aqui está o layout xml para a imagem superior:
fonte
layout_weight
diz ao Android como distribuir seusView
s em umLinearLayout
. O Android primeiro calcula a proporção total necessária para todos osView
s com um peso especificado e coloca cada um deView
acordo com a fração da tela que ele especificou. No exemplo a seguir, o Android vê que osTextView
s têm umlayout_weight
de0
(esse é o padrão) e osEditText
s têm umlayout_weight
de2
cada, enquanto oButton
peso é de1
. Portanto, o Android aloca espaço "apenas o suficiente" para exibirtvUsername
e, emtvPassword
seguida, divide o restante da largura da tela em 5 partes iguais, duas das quais são alocadasetUsername
, duasetPassword
e a última parte parabLogin
:Parece que:
e
fonte
Pense assim, será mais simples
Se você tiver 3 botões e o peso deles for 1,3,1 em conformidade, funcionará como a tabela em HTML
Forneça 5 partes para essa linha: 1 parte para o botão 1, 3 partes para o botão 2 e 1 parte para o botão 1
Que diz respeito,
fonte
uma das melhores explicações para mim foi esta (no tutorial do Android, procure a etapa 7) :
fonte
http://developer.android.com/guide/topics/ui/layout-objects.html#linearlayout
layout_weight define quanto espaço o controle deve obter, respectivamente, para outros controles.
fonte
Para adicional :
Para
vertical
orientação, não se esqueça de definirheight
0dpPara
horizontal
orientação, não se esqueça de definirwidth
0dpfonte
Veja a weightSum de LinearLayout e o layout_weight de cada View. android: weightSum = "4" android: layout_weight = "2" android: layout_weight = "2" O layout_height são ambos 0px, mas não tenho certeza se é relevante
fonte
Combinando as duas respostas de
Flo & rptwsthi e roetzi,
Lembre-se de mudar o seu
layout_width=0dp/px
, caso contrário, olayout_weight
comportamento agirá inversamente com o maior número ocupado no menor espaço e o menor número ocupado no maior espaço.Além disso, algumas combinações de pesos farão com que alguns layouts não sejam mostrados (uma vez que ocuparam demais o espaço).
Cuidado com isso.
fonte
Adicionar
android:autoSizeTextType="uniform"
irá redimensionar o texto automaticamentefonte
Como o nome sugere, a espessura do layout especifica qual quantidade ou porcentagem de espaço que um campo ou widget específico deve ocupar no espaço da tela.
Se especificarmos o peso na orientação horizontal, devemos especificar
layout_width = 0px
.Da mesma forma, se especificarmos o peso na orientação vertical, devemos especificar
layout_height = 0px
.fonte