Göreli Mizanpajdaki Bir Button öğesinin layout_align_parent_right niteliğini programatik olarak nasıl ayarlayabilirim?


285

Programsal olarak oluşturduğum göreceli bir düzenim var:

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

Şimdi bu göreceli düzende eklemek istediğim iki düğme var. Ancak sorun, her iki düğmenin de birbiri üzerine binen RelatiiveLayout öğesinin solunda gösterilmesidir.

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

Şimdi programlı olarak android:layout_alignParentRight="true"veya android:layout_toLeftOf="@id/btn"düğmelerin özniteliğini xml'de yaptığımız gibi nasıl ayarlayabileceğimi bilmek istiyorum ?

Yanıtlar:


638

LayoutParamsKullanarak herhangi bir koddan erişebilirsiniz View.getLayoutParams. Sadece neye LayoutParamseriştiğinizin çok farkında olmalısınız . Bu normalde içerdiği ViewGroupbir LayoutParamsiç çocuğa sahip olup olmadığını kontrol ederek elde edilir, o zaman kullanmanız gerekir. Senin durumunda RelativeLayout.LayoutParams. Kullanacaksın RelativeLayout.LayoutParams#addRule(int verb)veRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Buna kod yoluyla ulaşabilirsiniz:

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

1
çapanın kimliği yoksa ne olur? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = yeni TextView (işlem);
Saint Robson

18
kimlik eklemeye ne dersiniz?
user2161301

1
Ya buttonbir RecycleView? Aynı widget'a aynı veya karşıt kurallar eklemek sorun değil mi?
János

Sadece bir kez çalışıyor, eğer hizalamayı değiştirirsem güncellenmiyor. Sorunun ne olabileceğini öğrenebilir miyim ??
Shshank Bhong

Bunu kullanarak denedim ama benim kod kırmızı gider addRule?

12
  1. referans almanız gereken düğmeler için kimlik oluşturmanız gerekir: btn1.setId(1);
  2. düzeninize parametreler eklemek için params değişkenini kullanabilirsiniz, bence yöntem addRule()bu LayoutParamsnesne için android java belgelerine göz atın .

Herhangi bir kod parçasını çok takdir ediyorum. Düğmede herhangi bir yöntem bulamıyorum.
Fahad Ali

SetId, @IdRes'e açıklama eklediğinden, id ayarının yapılması yalnızca bir sayı yerine gerçek bir kaynak kimliği beklediğinden yardımcı olmaz.
Kevin Tan

Size geçmiş örneğin düzenleri arasından bir kaynak sayısını alıp collide.i tahminim google o / bloke olması gerekir olmaz kaynak kimliği için bir üs olarak kullanabilir o, o zaman yenilikler
codeScriber

6

RelativeLayoutDeğeri doğru veya yanlış olan bir özniteliği 0yanlış ve RelativeLayout.TRUEdoğru için kullanmak için :

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

Özelliğin önceden eklenmiş olup olmadığı önemli değildir, yine de addRule(verb, subject)özelliği etkinleştirmek / devre dışı bırakmak için kullanılır. Ancak sonrası API 17 kullanabilirsiniz removeRule(verb)sadece bir kısayol olan addRule(verb, 0).


0

Kotlin versiyonu:

Bu uzantıları, sonraki çağrıları basitleştiren infix işlevleriyle kullanın

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
}

Sonra bunları infix fonksiyonlarının çağrısı olarak kullanın:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Veya bunları normal işlevler olarak kullanabilirsiniz:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
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.