Escrevi alguns arquivos de layout em que usei o layout_weight
atributo para criar uma proporção entre diferentes visualizações.
Em algum momento, começo a receber avisos sobre pesos aninhados.
Então, eu me pergunto por que os pesos aninhados são ruins para o desempenho e se existe uma maneira mais eficiente de criar uma proporção constante entre as dimensões da visualização que podem ser usadas para diferentes tamanhos de tela e que não precisam especificar muitos valores de dpi da dimensão através de vários arquivos de layout (para diferentes tamanhos de tela, quero dizer).
Obrigado!
android
android-layout
performance
MobileCushion
fonte
fonte
Respostas:
Pesos aninhados são ruins para o desempenho porque:
É melhor usar RelativeLayout se ajustar sua visualização de acordo com os locais de outras visualizações sem usar valores de dpi específicos.
fonte
Atualização: como sabemos, a porcentagem de biblioteca de suporte foi descontinuada do nível 26 da API.
ConstraintLayout
É a nova maneira de obter a mesma estrutura xml plana.Projeto Github atualizado
Amostras atualizadas:
Atualização: Ótimas notícias na biblioteca de suporte percentual do Android resolve nosso problema de desempenho e o peso aninhado e aninhado
LinearLayout
Considere este layout simples para demonstrar o mesmo.
Degradador de desempenho evitado aninhado
LinearLayout
com pesos.Realmente incrível !!!.fonte
Eu acho (e provavelmente serei inflamado por isso), mas, novamente, acho que meu telefone tem um processador quad core para rivalizar (se não destruir completamente) os PCs domésticos da maioria das pessoas.
Eu também acho que esse tipo de capacidade de hardware é o futuro dos telefones.
Portanto, chego à conclusão de que, desde que você não se empolgue com o aninhamento (no MHO, um layout nunca deve ter mais de quatro níveis de profundidade e, se é que você provavelmente está fazendo errado), seu telefone pode se importar menos sobre ter pesos.
Há muitas coisas que você pode fazer que terão um efeito muito mais abrangente no desempenho e, em seguida, se preocupem com o processador fazendo algumas contas extras.
(observe que estou sendo um pouco humorístico e, portanto, para não levar nada muito a sério nesta postagem, a ideia de que há outras coisas que você deve otimizar primeiro e de que se preocupar com um peso profundo de 2 a 3 níveis não está ajudando sua saúde)
fonte
A principal razão pela qual os pesos aninhados são ruins é que, quando um layout tem filhos com peso, ele deve ser medido duas vezes (acho que isso é mencionado no aviso de fiapos). Isso significa que um layout ponderado que também contém um layout ponderado deve ser medido quatro vezes e cada 'camada' de pesos que você adiciona aumenta as medidas com uma potência de dois.
No ICS (nível API 14),
GridLayout
foi adicionado o que permite soluções simples e "planas" para muitos layouts que anteriormente exigiam pesos. Se você está desenvolvendo para versões anteriores do Android, terá mais dificuldade em remover pesos, mas usarRelativeLayout
e achatar o máximo possível de seu layout na cabine normalmente remove muitos pesos aninhados.fonte
GridLayout
ouRelativeLayout
. Por exemplo, paraGridLayout
: "GridLayout não oferece suporte ao princípio de peso, conforme definido em peso. Em geral, não é possível configurar um GridLayout para distribuir espaço em excesso entre vários componentes".Existe uma solução fácil para evitar LinearLayouts aninhados com pesos - basta usar Tablelayout com weightSum e LinearLayout aninhado com weightSum - O Tablelayout possui os mesmos atributos que LinearLayout (orientação, weightSum, layout_weight etc.) e não mostra a mensagem - "pesos aninhados tem ruim para o desempenho "
Exemplo:
fonte
Penso que a única alternativa é criar uma função que seria chamada onResume e definirá todos os tamanhos e posições. De qualquer forma, em peso, você pode definir apenas tamanhos, mas sem preenchimento (para que os layouts se tornem ainda mais complicados), sem tamanho de texto (impossível de compensar isso de alguma forma), sem falar em número de linhas.
fonte