2010-07-11 30 views
191

Tôi đang cố gắng tạo động đối tượng TableRow và thêm chúng vào một số TableLayout. Đối tượng TableRow có 2 mục, TextViewCheckBox. Các mặt hàng TextView cần phải có trọng lượng bố cục được đặt thành 1 để đẩy các mục CheckBox sang bên phải.Đặt trọng số bố cục của một TextView theo chương trình

Tôi không thể tìm thấy tài liệu về cách lập trình trọng số bố cục của mục TextView.

Trả lời

337

Bạn phải sử dụng TableLayout.LayoutParams với một cái gì đó như thế này:

TextView tv = new TextView(v.getContext()); 
tv.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1f)); 

Tham số cuối cùng là trọng lượng.

+14

tôi không đề cập đến điều này trước, vì vậy tôi xin lỗi. Nhưng tôi đã thử điều này trước khi hỏi câu hỏi của tôi. Nó làm cho TextView biến mất khỏi bố cục. Nhưng, trên một lưu ý tích cực, tôi thấy rằng việc thiết lập thuộc tính stretch_columns của TableLayout thành 0 gây ra hiệu ứng mà tôi đang tìm kiếm (TextView ở bên trái, các hộp kiểm bên phải). Cảm ơn sự giúp đỡ. – eugene

+8

Nếu bạn đang nhập bố cục XML và bạn không tạo bố cục động, bạn có thể lấy bố cục như sau: 'TextView tv = (TextView) findViewById (R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams (new LinearLayout.LayoutParams (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f)); ' –

+4

Để đặt trọng số bố cục theo lập trình,' TableRow.LayoutParams' nên được sử dụng thay cho 'TableLayout.LayoutParams'. Xem câu trả lời của @ Dorje. – Halil

-1

Tôi đã có một số lượng khá khó khăn với một giải pháp một cái gì đó rất giống với điều này: cố gắng để có hai nút trong một TableRow, với mỗi một nửa chiều rộng màn hình. Vì lý do gì đó, nút bên trái sẽ luôn chiếm khoảng 70% chiều rộng và nút phải 30%. Gọi table_layout.setStretchAllColumns (true) không có hiệu lực, cũng như không thiết lập chiều rộng của nút thành một nửa màn hình, cũng như không đặt trọng số bố trí của chúng.

Giải pháp mà tôi đã kết thúc bằng cách lồng một LinearLayout trong Bảng xếp hạng, trong đó đã làm tính đến giá trị của chiều rộng của nút.

TableLayout layout = new TableLayout(this); 
    TableRow top_row = new TableRow(this); 
    left_button = styleButton(); 
    right_button = styleButton(); 
    LinearLayout toprow_layout = new LinearLayout (this); 
    toprow_layout.setOrientation(LinearLayout.HORIZONTAL); 
    toprow_layout.addView (left_button); 
    toprow_layout.addView(right_button); 
    toprow.addView(top_layout); 
    layout.addView(top_row) 

    private Button styleButton() { 
      Button btn = new Button (this); 
      android.view.Display display = ((android.view.WindowManager)getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();  
      btn.setWidth((int)(display.getWidth()/2)); // set width to half 
      btn.setHeight(((int)display.getHeight()/6)); // set height to whatevs 
      btn.setText("foo"); 
      return btn; 
     } 
+1

Chỉ để bạn biết cho tương lai, giải pháp là đặt TableRow, Button1 và Button2 thành tất cả đều có 'layout_width = fill_parent' và sau đó, đặt' layout_weight = 1' cho cả button1 và button2. Tất cả các phần tử có fill_parent và layout_weight = 1 sẽ có kích thước bằng nhau khi lạm phát. – edthethird

86

Câu trả lời là bạn phải sử dụng TableRow.LayoutParams, không phải LinearLayout.LayoutParams hoặc bất kỳ LayoutParams nào khác.

TextView tv = new TextView(v.getContext()); 
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f); 
tv.setLayoutParams(params); 

Các LayoutParams khác nhau không thể hoán đổi cho nhau và nếu bạn sử dụng sai thì không có gì xảy ra. Quan điểm văn bản của cha mẹ là một dòng của bảng, do đó:

http://developer.android.com/reference/android/widget/TableRow.LayoutParams.html

+0

Câu trả lời này đã giúp tôi rất nhiều ... TableLayout đã không làm việc cho tôi –

+0

Aw man, bạn đã cứu tôi rất nhiều thời gian. Nó được chỉ định ở đâu? Tôi thấy không có gì trong tài liệu về bạn không thể trao đổi 'LayoutParams' –

+0

' TableRow.LayoutParams' đã làm công việc cho tôi quá –

5

này làm việc cho tôi, và tôi hy vọng nó sẽ làm việc cho bạn cũng

Đặt LayoutParams cho xem cha mẹ đầu tiên:

myTableLayout.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.FILL_PARENT, 
       TableLayout.LayoutParams.FILL_PARENT)); 

sau đó thiết lập cho TextView (trẻ em):

TableLayout.LayoutParams textViewParam = new TableLayout.LayoutParams 
    (TableLayout.LayoutParams.WRAP_CONTENT, 
    TableLayout.LayoutParams.WRAP_CONTENT,1f); 
    //-- set components margins 
    textViewParam.setMargins(5, 0, 5,0); 
    myTextView.setLayoutParams(textViewParam); 
11

chỉ cần đặt params bố trí trong cách bố trí đó như

tạo biến param

android.widget.LinearLayout.LayoutParams params = new android.widget.LinearLayout.LayoutParams(
      LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f); 

1f là trọng lượng biến

thiết lập widget hoặc bố trí của bạn như

TextView text = (TextView) findViewById(R.id.text); 
text.setLayoutParams(params); 
+0

nơi bạn nhận được thông tin này 1f có nghĩa là trọng số biến? Bạn có thể cung cấp liên kết không? – hayonj

+0

@hayonj chỉ kiểm tra nguồn của phương thức khởi tạo 'LinearLayout.LayoutParams'.Tham số thứ 3 là trọng số. Hoặc [tài liệu] (http://developer.android.com/reference/android/widget/LinearLayout.LayoutParams.html) – mente

1

Có một cách khác để làm điều này .Trong trường hợp bạn cần phải thiết lập chỉ có một tham số, ví dụ 'chiều cao':

TextView textView = (TextView)findViewById(R.id.text_view); 
ViewGroup.LayoutParams params = textView.getLayoutParams(); 
params.height = ViewGroup.LayoutParams.WRAP_CONTENT; 
textView.setLayoutParams(params); 
+0

lưu ý, không hoạt động cho 2.3 – djdance

6

Bạn cũng có thể cung cấp cho trọng lượng riêng như thế này,

LayoutParams lp1 = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); 

lp1.weight=1; 
34

trong các câu trả lời trước đó cân được truyền đến hàm tạo của đối tượng SomeLayoutType.LayoutParams mới. Tuy nhiên trong nhiều trường hợp nó là thuận tiện hơn để sử dụng đối tượng hiện có - nó giúp để tránh đối phó với các thông số chúng ta không quan tâm đến

Một ví dụ:

// Get our View (TextView or anything) object: 
View v = findViewById(R.id.our_view); 

// Get params: 
LinearLayout.LayoutParams loparams = (LinearLayout.LayoutParams) v.getLayoutParams(); 

// Set only target params: 
loparams.height = 0; 
loparams.weight = 1; 
v.setLayoutParams(loparams); 
+0

loparams có thể là NULL để đảm bảo bạn kiểm tra xem trước khi gọi setLayoutParams() – AAgg

+0

@AAgg, không phải trong tình huống thực tế. Chế độ xem sẽ không tăng cao nếu không có chiều rộng và chiều cao được đặt. Nhưng tôi đồng ý - đó là một thực hành tốt để kiểm tra khi nào có nghi ngờ về null. – sberezin

10
TextView text = new TextView(v.getContext()); 
text.setLayoutParams(new TableLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
               LayoutParams.WRAP_CONTENT, 1f)); 

(OR)

TextView tv = new TextView(v.getContext()); 
LayoutParams params = new TableRow.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f); 
tv.setLayoutParams(params); 
.

1f được gọi là trọng số = 1; theo nhu cầu của bạn, bạn có thể cung cấp cho 2f hoặc 3f, lượt xem sẽ di chuyển mã hóa vào không gian. Để đặt khoảng cách được chỉ định giữa các chế độ xem trong Bố cục tuyến tính, hãy sử dụng weightsum cho "LinearLayout".

LinearLayout ll_Outer= (LinearLayout) view.findViewById(R.id.linearview); 
LinearLayout llInner = new LinearLayout(this); 
      LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FillParent, LinearLayout.LayoutParams.WrapContent); 
      llInner.Orientation = Orientation.Horizontal; 
      llInner.WeightSum = 2; 
      ll_Outer.AddView(llInner); 
11
TextView txtview = new TextView(v.getContext()); 
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f); 
txtview.setLayoutParams(params); 

1f là biểu thị như weight = 1; bạn có thể cho 2f hoặc 3F, quan điểm sẽ di chuyển accoding vào không gian

5

này nên làm việc cho bạn

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT LayoutParamsMATCH_PARENT); 

param.weight=1.0f; 
Các vấn đề liên quan