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.