Estou tentando obter o seguinte programaticamente (em vez de declarativamente via XML):
<RelativeLayout...>
<TextView ...
android:id="@+id/label1" />
<TextView ...
android:id="@+id/label2"
android:layout_below: "@id/label1" />
</RelativeLayout>
Em outras palavras, como faço para que o segundo TextView
apareça abaixo do primeiro, mas quero fazê-lo no código:
RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);
Atualizar:
Obrigado, TreeUK. Eu entendo a direção geral, mas ainda não funciona - "B" se sobrepõe a "A". O que estou fazendo de errado?
RelativeLayout layout = new RelativeLayout(this);
TextView tv1 = new TextView(this);
tv1.setText("A");
TextView tv2 = new TextView(this);
tv2.setText("B");
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
lp.addRule(RelativeLayout.RIGHT_OF, tv1.getId());
layout.addView(tv1);
layout.addView(tv2, lp);
Respostas:
Pelo que pude reunir, é necessário adicionar a exibição usando LayoutParams.
Todo o crédito a ser mantido, para posicionar relativamente seus itens de forma programática, é necessário atribuir IDs a eles.
Então
addRule(RelativeLayout.RIGHT_OF, tv1.getId());
fonte
below
já foi adicionada, como garantir que ele ainda seja renderizado corretamente? Pelo meu entendimento,addView
faz com que o layout seja re-renderizado; portanto, se eu fizer isso para um item que ainda não foi adicionado, ele será travado, pois o item com esse ID ainda não existe.Resuma a história longa: com o layout relativo, você posiciona elementos dentro do layout.
crie um novo RelativeLayout.LayoutParams
(o que quer que seja ... preencha o conteúdo pai ou quebra automática, números absolutos, se necessário, ou faça referência a um recurso XML)
Adicionar regras: as regras se referem aos pais ou a outros "irmãos" na hierarquia.
Basta aplicar os parâmetros de layout: A maneira mais "saudável" de fazer isso é:
Cuidado : não altere o layout dos retornos de chamada do layout. É tentador fazê-lo porque é quando as visualizações obtêm seus tamanhos reais. No entanto, nesse caso, são esperados resultados inesperados.
fonte
parentLayout.addView(myView, lp
). Eu sempre fiz isso em duas linhas de código. Obrigado!Apenas passei 4 horas com esse problema. Finalmente percebi que você não deve usar zero como ID da visualização . Você pensaria que é permitido como NO_ID == -1, mas as coisas tendem a dar errado se você der a sua opinião ...
fonte
Exemplo de executável mínimo do Android 22
Fonte:
Trabalha com o projeto padrão gerado por
android create project ...
. Repositório GitHub com código de compilação mínimo .fonte
TextView
? Eu tentei e o terceiroTextView
está faltando.ligar
depois de
fonte
Experimentar:
fonte
Essa abordagem com ViewGroup.MarginLayoutParams funcionou para mim:
fonte
fonte
Se você realmente deseja fazer o layout manualmente, sugiro não usar um layout padrão. Faça tudo por conta própria, aqui está um exemplo do kotlin:
Isso pode lhe dar uma idéia de como isso poderia funcionar
fonte