Dapatkah saya mengatur "android: layout_below" di Runtime Secara terprogram?


Jawaban:


464

Iya:

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

Pertama, kode menciptakan params tata letak baru dengan menentukan tinggi dan lebar. The addRuleMetode menambahkan setara dengan xml dengan benar android:layout_below. Maka Anda cukup memanggil View#setLayoutParamstampilan yang Anda ingin memiliki param tersebut.


11
mengapa jawaban ini tidak bisa diterima? Itu penjelasan yang sangat bagus.
— Adithya

145

Atau Anda dapat menggunakan parameter tampilan layout saat ini dan memodifikasinya:

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

14
@ ElLee Cukup jelas cara lain untuk menjawab pertanyaan, itulah sebabnya ada 11 upvotes.
— Alex K

8
Ini harus memiliki lebih banyak suara daripada jawaban yang lain: untuk menjaga perilaku pandangan yang konsisten, kita harus bekerja dengan yang sudah ada LayoutParamsdaripada menciptakan yang baru. Sebenarnya, ini harus diterima sebagai jawaban yang benar.
— Alex Karshin

10

Sementara jawaban @jackofallcode benar, ia dapat ditulis dalam satu baris:

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

1
ini tidak memungkinkan Anda untuk benar-benar mengubah tata letak karena Anda memerlukan referensi LayoutParamsuntuk mengaturnya dengansetLayoutParams
— Stef

@Stef, saya menggunakan solusi ini dalam satu proyek. Sementara solusi jackofallcode adalah satu-satunya di sini, saya menyederhanakannya. Tapi sekarang saya pikir pemendekan menjadi satu baris tidak baik, karena jika ada pengecualian, akan lebih sulit untuk memahami operator mana yang mengangkatnya.
— CoolMind

1
@ CoolMind Saya tidak terlalu suka memperpendek kode ke 1 baris, itu membuatnya lebih sulit untuk dibaca, terutama ketika casting terlibat. Plus melakukannya dengan cara saya memungkinkan Anda untuk membuat perubahan lebih lanjut :)
— jackofallcode

@jackofallcode, setuju dengan Anda! Saat ini saya juga menulis dalam beberapa baris, karena ketika crash terjadi, lebih mudah untuk memahami pada baris apa kesalahan terjadi.
— CoolMind

1

Versi Kotlin dengan fungsi infix

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

Maka Anda dapat menulis:

view1 below view2

Atau Anda dapat menyebutnya sebagai fungsi normal:

view1.below(view2)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.