Bagaimana secara terprogram mengatur atribut layout_align_parent_right dari Tombol di Layout Relatif?

285

Saya memiliki tata letak relatif yang saya buat secara terprogram:

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

Sekarang saya memiliki dua tombol yang ingin saya tambahkan dalam tata letak relatif ini. Namun masalahnya adalah kedua tombol ditampilkan di sebelah kiri RelatiiveLayout yang saling tumpang tindih.

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

Sekarang saya ingin tahu bagaimana saya bisa secara terprogram mengatur android:layout_alignParentRight="true"atau android:layout_toLeftOf="@id/btn"atribut tombol seperti yang kita lakukan di xml?

Fahad Ali
sumber

Jawaban:

638

Anda dapat mengakses LayoutParamsdari kode menggunakan View.getLayoutParams. Anda hanya harus sangat menyadari apa yang LayoutParamsAnda akses. Hal ini biasanya dicapai dengan memeriksa mengandung ViewGroupjika memiliki LayoutParamsanak batin maka itulah yang harus Anda gunakan. Dalam kasus Anda, ini RelativeLayout.LayoutParams. Anda akan menggunakan RelativeLayout.LayoutParams#addRule(int verb)danRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Anda bisa mendapatkannya melalui kode:

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
Schuler yang kaya
sumber
1
bagaimana jika jangkar tidak memiliki id? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = TextView baru (babak);
Saint Robson
18
bagaimana dengan menambahkan ID?
user2161301
1
Bagaimana jika buttonada pada RecycleView? Bukankah ini masalah menambahkan aturan yang sama atau berlawanan ke widget yang sama?
János
Ini hanya berfungsi sekali, jika saya mengubah perataannya tidak diperbarui. Bolehkah saya tahu apa yang bisa menjadi masalah ??
Shshank Bhong
Saya mencoba menggunakan itu tetapi dalam kode saya berwarna merah addRule?
12
  1. Anda perlu membuat dan id untuk tombol yang perlu Anda rujuk: btn1.setId(1);
  2. Anda dapat menggunakan variabel params untuk menambahkan parameter ke tata letak Anda, saya pikir metode ini addRule(), periksa android java docs untuk LayoutParamsobjek ini .
codeScriber
sumber
Saya akan sangat menghargai setiap bagian kode. Saya tidak menemukan metode apa pun di tombol.
Fahad Ali
Pengaturan id tidak membantu karena mengharapkan id sumber daya nyata, bukan hanya nomor karena setId sedang dijelaskan dengan @IdRes.
Kevin Tan
itu baru, di masa lalu Anda bisa mengambil nomor sumber daya dari tata letak misalnya dan menggunakannya sebagai basis untuk id sumber daya yang tidak akan bertabrakan. saya kira google pasti telah memblokir bahwa /
codeScriber
6

Untuk menambahkan RelativeLayoutatribut yang nilainya benar atau salah, gunakan 0untuk false dan RelativeLayout.TRUEuntuk true:

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

Tidak masalah apakah atribut sudah ditambahkan atau tidak, Anda masih menggunakan addRule(verb, subject)untuk mengaktifkan / menonaktifkannya. Namun, post-API 17 dapat Anda gunakan removeRule(verb)yang hanya merupakan jalan pintas addRule(verb, 0).

sepatu
sumber
0

Versi Kotlin:

Gunakan ekstensi ini dengan fungsi infiks yang menyederhanakan panggilan nanti

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
}

Kemudian gunakan mereka sebagai panggilan fungsi infiks:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Atau Anda dapat menggunakannya sebagai fungsi normal:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Mahmoud
sumber