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.