2012-05-03 71 views
10

ViewGroup.addView sao chép LayoutParams dữ liệu vào bên trong hoặc liên kết với nó? Tôi có thể sử dụng lại cùng một phiên bản LayoutParams với nhiều cuộc gọi đến addView() với các chế độ xem khác nhau không?Tôi có thể sử dụng lại LayoutPrams với ViewGroup.addView không?

Không có gì về nó trong apidoc.

WOW

Câu trả lời là NO (kiểm tra bằng thực nghiệm):

public class SymbolPadActivity extends Activity { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    RelativeLayout.LayoutParams labelParams; 

    /* 
    * This block to reuse is not working 
    labelParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    labelParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); 
    labelParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 
    */ 


    RelativeLayout mover = new RelativeLayout(this); 

    TextView textView; 
    for(int leftMargin = 0; leftMargin<3000; leftMargin += 100) { 
     for(int topMargin=0; topMargin<800; topMargin += 40) { 

      // I can't omit these 3 lines 
      labelParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
      labelParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); 
      labelParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 

      labelParams.leftMargin = leftMargin; 
      labelParams.topMargin = topMargin; 

      textView = new TextView(this); 
      textView.setText("(" + leftMargin + "," + topMargin + ")"); 
      mover.addView(textView, labelParams); 

     } 
    } 




    RelativeLayout.LayoutParams moverParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
    moverParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE); 
    moverParams.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); 
    moverParams.leftMargin = 0; 
    moverParams.topMargin = 0; 

    RelativeLayout stator = new RelativeLayout(this); 
    stator.addView(mover, 0, moverParams); 

    setContentView(stator); 


} 

}

+0

tôi tái sử dụng params của tôi, nó làm việc! Nhưng cameraview của tôi ngừng hoạt động. :/Tôi thậm chí không thể tái sử dụng một param trong constructor LayoutParms để tạo một O_O khác. –

Trả lời

5

Có gì về nó trong apidoc là.

Điều này có nghĩa là bạn cần phải thực hiện lựa chọn bảo thủ hơn, bất kể triển khai hiện tại là gì, vì việc triển khai có thể thay đổi.

Do đó, bạn cần giả định rằng nó không được lưu để sử dụng lại một phiên bản LayoutParams để sử dụng với Views khác nhau.

FWIW, AFAICT, điều đó cũng đúng - ViewGroup dường như không sao chép.

1

Đây là một câu hỏi cũ, nhưng có vẻ là một câu trả lời Cập nhật:

Các LayoutParams có một constructor để sao chép khác Nguồn: http://developer.android.com/reference/android/view/ViewGroup.LayoutParams.html

ViewGroup.LayoutParams(ViewGroup.LayoutParams source) 

này sẽ đề nghị không để tái sử dụng nhưng có lẽ để tạo 1 đối tượng bố cục đối tượng với mọi thứ bạn cần, sau đó chỉ cần gọi

new LayoutParams(someLayoutParamsToReUse) 

Trong trường hợp của tôi, tôi muốn et các thông số bố trí của một nút sẽ giống với nút khác. Ban đầu tôi đã cố gắng:

button.setLayoutParams(button2.getLayoutParams()); 

này sẽ không làm việc, tuy nhiên điều này nên:

button.setLayoutParams(new LayoutParms(button2.getLayoutParams))' 
Các vấn đề liên quan