Tive muitos problemas para fazer com que o LayoutInflater funcionasse conforme o esperado e outras pessoas também: Como usar o layoutinflator para adicionar visualizações no tempo de execução? .
Por que o LayoutInflater ignora os parâmetros de layout que eu especifiquei? Por exemplo, por que o layout_width
e layout_height
valores do meu XML recursos não honrado?
android
android-layout
andig
fonte
fonte
Respostas:
Investiguei esse problema, consultando os documentos LayoutInflater e configurando um pequeno projeto de demonstração de amostra. Os tutoriais a seguir mostram como preencher dinamicamente um layout usando
LayoutInflater
.Antes de começarmos, veja como são os
LayoutInflater.inflate()
parâmetros:R.layout.main_page
)attachToRoot
fortrue
) ou simplesmente um objeto que fornece um conjunto deLayoutParams
valores para a raiz da hierarquia retornada (seattachToRoot
forfalse
).attachToRoot : se a hierarquia inflada deve ser anexada ao parâmetro raiz? Se falso, root será usado apenas para criar a subclasse correta da
LayoutParams
visualização raiz no XML.Retorna : a visão raiz da hierarquia inflada. Se a raiz foi fornecida e
attachToRoot
étrue
, isso é raiz; caso contrário, é a raiz do arquivo XML inflado.Agora, para o layout e o código de amostra.
Layout principal (
main.xml
):Adicionado neste contêiner é um TextView separado, visível como um pequeno quadrado vermelho se os parâmetros de layout forem aplicados com êxito a partir de XML (
red.xml
):Agora
LayoutInflater
é usado com várias variações de parâmetros de chamadaOs resultados reais das variações de parâmetros estão documentados no código.
SINOPSE: Chamar
LayoutInflater
sem especificar leads raiz para aumentar a chamada, ignorando os parâmetros de layout do XML. A chamada inflar com raiz não é igualnull
eattachRoot=true
carrega os parâmetros de layout, mas retorna o objeto raiz novamente, o que impede outras alterações de layout no objeto carregado (a menos que você possa encontrá-lo usandofindViewById()
). A convenção de chamada que você provavelmente gostaria de usar é, portanto, esta:Para ajudar com problemas de layout, o Inspetor de layout é altamente recomendado.
fonte
Activity
é uma subclasse deContext
e os exemplos da resposta estão no escopo deActivity
, portanto, para simplificá-lo, substituígetBaseContext()
-othis
por, para o bem desta resposta, é equivalente.andig está correto que um motivo comum para LayoutInflater ignorar seus layout_params seria porque uma raiz não foi especificada. Muitas pessoas pensam que você pode passar nulo para root. Isso é aceitável para alguns cenários, como uma caixa de diálogo, em que você não tem acesso à raiz no momento da criação. Uma boa regra a seguir, no entanto, é que, se você tiver root, forneça ao LayoutInflater.
Eu escrevi um post detalhado sobre isso que você pode conferir aqui:
https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/
fonte
This is acceptable for a few scenarios such as a dialog
que era tudo que eu precisavaquero adicionar à resposta principal acima
Eu tentei segui-lo, mas meu recyclerView começou a esticar todos os itens para uma tela,
eu tive que adicionar a próxima linha depois de inflar para alcançar o objetivo
Eu já adicionei esses parâmetros por xml, mas não funcionou corretamente
e com esta linha está tudo ok
fonte