Posso impostare "android: layout_below" in fase di esecuzione a livello di codice?


Risposte:


464

Sì:

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);

Innanzitutto, il codice crea un nuovo parametro di layout specificando l'altezza e la larghezza. Il addRulemetodo aggiunge correttamente l'equivalente dell'xml android:layout_below. Quindi fai semplicemente clic View#setLayoutParamssulla vista che desideri avere quei parametri.


11
perché questa risposta non può essere accettata? È un'ottima spiegazione.
— Adithya,

145

In alternativa è possibile utilizzare i parametri di layout correnti delle viste e modificarli:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@EelLee È chiaramente un altro modo di rispondere alla domanda, motivo per cui ha 11 voti positivi.
— Alex K,

8
Questo dovrebbe avere più voti rispetto all'altra risposta: per mantenere un comportamento coerente della vista, dovremmo lavorare con quelli esistenti LayoutParamspiuttosto che crearne di nuovi. In realtà, questa dovrebbe essere accettata come la risposta corretta.
— Alex Karshin,

10

Mentre la risposta di @jackofallcode è corretta, può essere scritta in una riga:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
questo non ti consente di cambiare effettivamente il layout in quanto hai bisogno di un riferimento LayoutParamsper impostarli consetLayoutParams
— Stef

@Stef, ho usato questa soluzione in un progetto. Mentre la soluzione jackofallcode è l'unica qui, l'ho semplificata. Ma ora penso che accorciare una riga non sia buono, perché se si verifica un'eccezione, sarebbe più difficile capire quale operatore l'ha sollevata.
— CoolMind

1
@CoolMind Non mi piace molto accorciare il codice su 1 riga, rende più difficile la lettura, specialmente quando è coinvolto il casting. Inoltre, farlo a modo mio ti consente di apportare ulteriori modifiche :)
— codice jackofall

@jackofallcode, d'accordo con te! Attualmente scrivo anche in più righe, perché quando si verifica un arresto anomalo, è più facile capire in quale riga si è verificato un errore.
— CoolMind

1

Versione di Kotlin con funzione infix

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

Quindi puoi scrivere:

view1 below view2

Oppure puoi chiamarlo come una normale funzione:

view1.below(view2)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.