2016-02-19 29 views
6

Ví dụ, nếu bạn muốn thay đổi ot LayoutParams của một số quan điểm để WRAP_CONTENT cho cả widthheight programmaticaly, nó sẽ trông somethong như thế này:Tại sao chúng ta sử dụng setLayoutParams?

final ViewGroup.LayoutParams lp = yourView.getLayoutParams(); 
lp.height = ViewGroup.LayoutParams.WRAP_CONTENT; 
lp.width = ViewGroup.LayoutParams.WRAP_CONTENT; 

Như tôi undestood getLayoutParams lợi nhuận tài liệu tham khảo cho params, do đó, mã này sẽ là đủ, nhưng tôi thường thấy trong các ví dụ và như vậy sau đó dòng này, một sau:

yourView.setLayoutParams(lp); 

Và tôi tự hỏi điểm của dòng này là gì. Đây có phải là chỉ vì lợi ích của mã dễ đọc hơn hoặc có trường hợp khi nó sẽ không hoạt động mà không có nó?

+0

Tôi bỏ phiếu dễ đọc. Mặc dù, tôi chưa bao giờ thấy các ví dụ này khi các chế độ xem hiện tại phải được thay đổi kích thước động. Tôi thường thấy lượt xem được thêm động vào chế độ xem nội dung. Trong những trường hợp đó, setLayoutParams là cần thiết –

Trả lời

4

setLayoutParams() cũng kích hoạt resolveLayoutParams()requestLayout(), sẽ thông báo cho chế độ xem cái gì đó đã thay đổi, làm mới nó. Hoặc chúng tôi không thể đảm bảo các thông số bố cục mới hoạt động thực sự.


thấy View.setLayoutParams nguồn mã:

public void setLayoutParams(ViewGroup.LayoutParams params) { 
    if (params == null) { 
     throw new NullPointerException("Layout parameters cannot be null"); 
    } 
    mLayoutParams = params; 
    resolveLayoutParams(); 
    if (mParent instanceof ViewGroup) { 
     ((ViewGroup) mParent).onSetLayoutParams(this, params); 
    } 
    requestLayout(); 
} 
+0

Vì vậy, về cơ bản chúng ta cần nó chỉ khi xem đã được rút ra, và chúng ta cần phải thay đổi nó sau đó? –

+0

Có. Gọi nó khi thay đổi một tham số chế độ xem tồn tại trong thời gian chạy – sakiM

0

Không có cách nào để đảm bảo rằng mọi thay đổi bạn đã thực hiện đối với LayoutParams được trả về bởi getLayoutParams() sẽ được phản ánh chính xác. Nó có thể được thay đổi theo phiên bản Android. Vì vậy, bạn phải gọi setLayoutParams() để đảm bảo chế độ xem sẽ cập nhật những thay đổi đó.

0

Nếu bạn không sử dụng setLayoutParams(), thiết lập bố trí của bạn sẽ có hiệu quả trong khi View.onLayout() được gọi.

Đây là mã nguồn của View.setLayoutParams()

public void setLayoutParams(ViewGroup.LayoutParams params) { if (params == null) { throw new NullPointerException("Layout parameters cannot be null"); } mLayoutParams = params; resolveLayoutParams(); if (mParent instanceof ViewGroup) { ((ViewGroup) mParent).onSetLayoutParams(this, params); } requestLayout(); }

Như bạn thấy, các requestLayout sẽ được gọi trong setLayoutParams. Chế độ xem này sẽ được chuyển tiếp lại ngay lập tức. OnLayout cũng sẽ được gọi.

Các vấn đề liên quan