Programlı olarak Çalışma Zamanı'nda “android: layout_below” ayarlayabilir miyim?


Yanıtlar:


464

Evet:

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

İlk olarak, kod yükseklik ve genişlik belirterek yeni bir düzen parametreleri oluşturur. addRuleYöntem düzgün xml eşdeğer ekler android:layout_below. Sonra sadece View#setLayoutParamsbu paramlara sahip olmak istediğiniz görünümü çağırırsınız .


11
bu cevap neden kabul edilemiyor? Bu çok iyi bir açıklama.
Adithya

145

Alternatif olarak, görünümlerin mevcut düzen parametrelerini kullanabilir ve bunları değiştirebilirsiniz:

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

14
@EelLee Soruya cevap vermenin oldukça başka bir yolu, bu yüzden 11 oy var.
Alex K

8
Bunun diğer cevaba göre daha fazla oyu olmalıdır: görüşün tutarlı davranışını sürdürmek için LayoutParamsyenilerini yaratmak yerine var olanlarla çalışmalıyız. Aslında, bu doğru cevap olarak kabul edilmelidir.
Alex Karshin

10

@Jackofallcode yanıtı doğru olsa da, tek bir satırda yazılabilir:

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

1
bu, LayoutParamsonları ayarlamak için bir referansa ihtiyaç duyduğunuzda düzeni değiştirmenize izin vermezsetLayoutParams
Stef

@Stef, bu çözümü bir projede kullandım. Jackofallcode çözümü buradaki tek çözüm olsa da, basitleştirdim. Ama şimdi bir satıra kısaltmanın iyi olmadığını düşünüyorum, çünkü herhangi bir istisna oluşursa, operatörün onu ne yükselttiğini anlamak daha zor olurdu.
CoolMind

1
@CoolMind Kodu 1 satıra kısaltmayı gerçekten sevmiyorum, özellikle döküm söz konusu olduğunda okumayı zorlaştırıyor. Artı benim yolumu yaparak daha fazla değişiklik yapmanızı sağlar :)
jackofallcode 15:19

@jackofallcode, sana katılıyorum! Şu anda birkaç satırda da yazıyorum, çünkü çökme olduğunda, bir hatanın hangi satırda meydana geldiğini anlamak daha kolaydır.
CoolMind

1

Kotlin ile versiyon infix fonksiyonu

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

Sonra yazabilirsiniz:

view1 below view2

Veya normal bir işlev olarak adlandırabilirsiniz:

view1.below(view2)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.