Posso definir "android: layout_below" em tempo de execução programaticamente?

203

É possível ao criar um RelativeLayout em tempo de execução definir o equivalente de forma android:layout_belowprogramática?

AlanH
fonte

Respostas:

464

Sim:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

Primeiro, o código cria um novo parâmetro de layout, especificando a altura e a largura. O addRulemétodo adiciona o equivalente ao xml corretamente android:layout_below. Depois, basta acessar View#setLayoutParamsa visualização em que deseja obter esses parâmetros.

Rich Schuler
fonte
11
por que essa resposta não pode ser aceita? É uma explicação muito boa.
Adithya
145

Como alternativa, você pode usar os parâmetros de layout atuais das visualizações e modificá-los:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);
jackofallcode
fonte
14
@EelLee É claramente outra maneira de responder à pergunta, e é por isso que ela tem 11 votos positivos.
Alex K
8
Isso deve ter mais votos positivos do que a outra resposta: para manter um comportamento consistente da visão, devemos trabalhar com os existentes, em LayoutParamsvez de criar novos. De fato, isso deve ser aceito como a resposta correta.
Alex Karshin #
10

Enquanto a resposta @jackofallcode estiver correta, ela pode ser escrita em uma linha:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);
CoolMind
fonte
1
isso não permite que você para realmente mudar o layout como você precisa de uma referência ao LayoutParamsdefini-las comsetLayoutParams
Stef
@ Stef, eu usei esta solução em um projeto. Embora a solução jackofallcode seja a única aqui, eu a simplifiquei. Mas agora acho que encurtar uma linha não é bom, porque, se ocorrer alguma exceção, seria mais difícil entender o que a operadora criou.
CoolMind #
1
@CoolMind Eu realmente não gosto de encurtar o código para 1 linha, fica mais difícil de ler, especialmente quando a transmissão está envolvida. Além disso, fazer do meu jeito permite que você faça mais alterações :)
jackofallcode
@jackofallcode, concordo com você! Atualmente, também escrevo em várias linhas, porque quando ocorre uma falha, é mais fácil entender em que linha ocorreu um erro.
CoolMind 15/08/19
1

Versão Kotlin com função infix

infix fun View.below(view: View) {
      (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

Então você pode escrever:

view1 below view2

Ou você pode chamá-lo como uma função normal:

view1.below(view2)
Mahmoud
fonte