Làm cách nào để lập trình đặt thuộc tính layout_align_parent_right của một Nút trong Bố cục tương đối?


285

Tôi có một bố cục tương đối mà tôi đang tạo lập trình:

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

Bây giờ tôi có hai nút mà tôi muốn thêm vào trong bố cục tương đối này. Nhưng vấn đề là cả hai nút đang được hiển thị ở bên trái của RelatiiveLayout chồng chéo lên nhau.

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

Bây giờ tôi muốn biết làm thế nào tôi có thể lập trình cài đặt android:layout_alignParentRight="true"hoặc android:layout_toLeftOf="@id/btn"thuộc tính của các nút như chúng ta làm trong xml?

Câu trả lời:


638

Bạn có thể truy cập bất kỳ LayoutParamstừ mã bằng cách sử dụng View.getLayoutParams. Bạn chỉ cần có ý thức về những gì LayoutParamsbạn truy cập. Điều này thường đạt được bằng cách kiểm tra vật chứa ViewGroupnếu nó có LayoutParamscon bên trong thì đó là thứ bạn nên sử dụng. Trong trường hợp của bạn đó là RelativeLayout.LayoutParams. Bạn sẽ được sử dụng RelativeLayout.LayoutParams#addRule(int verb)RelativeLayout.LayoutParams#addRule(int verb, int anchor)

Bạn có thể lấy nó thông qua mã:

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
Nếu neo không có id thì sao? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = new TextView (hành động);
Saint Robson

18
Làm thế nào về việc thêm ID?
dùng2161301

1
Điều gì nếu buttonlà trên một RecycleView? Đây không phải là vấn đề khi thêm các quy tắc giống nhau hoặc ngược lại vào cùng một tiện ích?
János

Nó chỉ hoạt động một lần, nếu tôi thay đổi căn chỉnh thì nó không được cập nhật. Tôi có thể biết những gì có thể là vấn đề ??
Shshank Bhong

Tôi đã thử sử dụng nó nhưng nó có màu đỏ trong mã của tôi addRule?

12
  1. bạn cần tạo và id cho các nút bạn cần giới thiệu lại: btn1.setId(1);
  2. bạn có thể sử dụng biến params để thêm tham số vào bố cục của mình, tôi nghĩ phương thức này là addRule(), kiểm tra tài liệu java android cho LayoutParamsđối tượng này .

Tôi sẽ đánh giá cao bất kỳ đoạn mã nào. Tôi không tìm thấy bất kỳ phương pháp trong nút.
Fahad Ali

Cài đặt id không giúp ích vì nó mong đợi id tài nguyên thực sự thay vì chỉ một số vì setId đang được chú thích bằng @IdRes.
Kevin Tan

đó là mới sau đó, trước đây bạn có thể lấy số tài nguyên từ các bố cục và sử dụng nó làm cơ sở cho id tài nguyên sẽ không va chạm. Tôi đoán google phải chặn nó /
codeScacker

6

Để thêm một RelativeLayoutthuộc tính có giá trị là đúng hoặc sai, sử dụng 0sai và RelativeLayout.TRUEđúng:

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

Không quan trọng là thuộc tính đã được thêm hay chưa, bạn vẫn sử dụng addRule(verb, subject)để bật / tắt nó. Tuy nhiên, post-API 17 bạn có thể sử dụng removeRule(verb)chỉ là một phím tắt cho addRule(verb, 0).


0

Phiên bản Kotlin:

Sử dụng các tiện ích mở rộng này với các hàm infix giúp đơn giản hóa các cuộc gọi sau này

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
}

Sau đó sử dụng chúng như các lệnh gọi hàm infix:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Hoặc bạn có thể sử dụng chúng như các chức năng bình thường:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
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.