Como definir programaticamente o atributo layout_align_parent_right de um botão no layout relativo?

285

Eu tenho um layout relativo que estou criando programaticamente:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

Agora eu tenho dois botões que eu quero adicionar nesse layout relativo. Mas o problema é que os dois botões estão sendo mostrados à esquerda do RelatiiveLayout, sobrepostos um ao outro.

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

Agora, quero saber como definir programaticamente o android:layout_alignParentRight="true"ou android:layout_toLeftOf="@id/btn"atributo dos botões, como fazemos no xml?

Fahad Ali
fonte

Respostas:

638

Você pode acessar qualquer LayoutParamscódigo usando View.getLayoutParams. Você só precisa estar muito ciente do que LayoutParamsestá acessando. Isso normalmente é conseguido verificando o conteúdo ViewGroupse ele tem um LayoutParamsfilho interno, então é esse que você deve usar. No seu caso é RelativeLayout.LayoutParams. Você estará usando RelativeLayout.LayoutParams#addRule(int verb)eRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Você pode acessá-lo via código:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);

button.setLayoutParams(params); //causes layout update
Rich Schuler
fonte
1
e se a âncora não tiver id? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = new TextView (act);
Saint Robson
18
que tal adicionar o ID?
precisa saber é o seguinte
1
E se buttonestiver em um RecycleView? Não é um problema adicionar regras iguais ou opostas ao mesmo widget?
János
Está funcionando apenas uma vez, se eu alterar o alinhamento, não será atualizado. Posso saber qual pode ser o problema?
Shshank Bhong
Eu tentei usar isso, mas fica vermelho no meu código para addRule?
12
  1. é necessário criar e identificar os botões que você precisa para fazer referência: btn1.setId(1);
  2. você pode usar a variável params para adicionar parâmetros ao seu layout, acho que o método é addRule(), confira os documentos java android para esse LayoutParamsobjeto.
codeScriber
fonte
Eu apreciaria muito qualquer pedaço de código. Não encontro nenhum método no botão.
Fahad Ali
A identificação de configuração não ajuda, pois espera uma identificação de recurso real em vez de apenas um número, já que setId está sendo anotado com @IdRes.
Kevin Tan
que há de novo em seguida, no passado você poderia tomar uma série de recursos de layouts por exemplo, e usá-lo como base para identificação de recurso que não vai google palpite collide.i deve ter bloqueado que /
codeScriber
6

Para adicionar um RelativeLayoutatributo cujo valor é verdadeiro ou falso, use 0falso e RelativeLayout.TRUEverdadeiro:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)

Não importa se o atributo já foi adicionado ou não, você ainda o usa addRule(verb, subject)para ativar / desativar. No entanto, você pode usar o pós-API 17, removeRule(verb)que é apenas um atalho para addRule(verb, 0).

sapato
fonte
0

Versão Kotlin:

Use essas extensões com funções infix que simplificam as chamadas posteriores

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

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

infix fun View.alightParentRightIs(aligned: Boolean) {
    val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
    if (aligned) {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
    } else {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
    }
    this.layoutParams = layoutParams
}

Em seguida, use-os como chamadas de funções infix:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Ou você pode usá-los como funções normais:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Mahmoud
fonte