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.

Schuler yang kaya
sumber
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);
kode kunci jack
sumber
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);
CoolMind
sumber
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)
Mahmoud
sumber