Tôi có thể thiết lập Android android: layout_below trong thời gian chạy lập trình không?


Câu trả lời:


464

Đúng:

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

Đầu tiên, mã tạo ra một tham số bố cục mới bằng cách chỉ định chiều cao và chiều rộng. Các addRulephương pháp bổ sung tương đương với xml đúng android:layout_below. Sau đó, bạn chỉ cần gọi View#setLayoutParamsvào chế độ xem bạn muốn có các thông số đó.


11
Tại sao câu trả lời này không được chấp nhận? Đó là một lời giải thích rất tốt.
Adithya

145

Ngoài ra, bạn có thể sử dụng các tham số bố cục hiện tại và sửa đổi chúng:

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

14
@EelLee Đó là một cách khá rõ ràng khác để trả lời câu hỏi, đó là lý do tại sao nó có 11 upvote.
Alex K

8
Điều này nên có nhiều upvote hơn câu trả lời khác: để duy trì hành vi nhất quán của chế độ xem, chúng ta nên làm việc với hiện tại LayoutParamsthay vì tạo ra những cái mới. Trong thực tế, điều này nên được chấp nhận là câu trả lời chính xác.
Alex Karshin

10

Trong khi câu trả lời @jackofallcode là chính xác, nó có thể được viết thành một dòng:

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

1
điều này không cho phép bạn thực sự thay đổi bố cục khi bạn cần một tham chiếu đến LayoutParamsđể thiết lập chúng vớisetLayoutParams
Stef

@Stef, tôi đã sử dụng giải pháp này trong một dự án. Trong khi giải pháp jackofallcode là duy nhất ngay tại đây, tôi đã đơn giản hóa nó. Nhưng bây giờ tôi nghĩ rút ngắn xuống một dòng là không tốt, bởi vì nếu có bất kỳ ngoại lệ nào xảy ra, sẽ khó hiểu hơn những gì nhà điều hành đã nâng nó lên.
CoolMind

1
@CoolMind Tôi không thực sự thích rút ngắn mã thành 1 dòng, điều này làm cho việc đọc trở nên khó khăn hơn, đặc biệt là khi tham gia casting. Ngoài ra, theo cách của tôi, cho phép bạn thực hiện các thay đổi tiếp theo :)
jackofallcode

@jackofallcode, đồng ý với bạn! Hiện tại tôi cũng viết thành nhiều dòng, vì khi xảy ra sự cố, sẽ dễ hiểu hơn ở dòng nào xảy ra lỗi.
CoolMind

1

Phiên bản Kotlin với chức năng infix

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

Sau đó, bạn có thể viết:

view1 below view2

Hoặc bạn có thể gọi nó là một chức năng bình thường:

view1.below(view2)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.