Đặt trọng số bố cục của TextView theo chương trình


214

Tôi đang cố gắng tự động tạo TableRowcác đối tượng và thêm chúng vào a TableLayout. Các TableRowđối tượng có 2 mục, a TextViewvà a CheckBox. Các TextViewmục cần phải đặt trọng số bố trí của chúng thành 1 để đẩy các CheckBoxmục sang bên phải.

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

Câu trả lời:


355

Bạn phải sử dụng TableLayout.LayoutParamsvớ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.


15
Tôi đã không đề cập đến điều này trước đây, vì vậy tôi xin lỗi. Nhưng tôi đã thử điều này trước khi đặt 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 đặt thuộc tính Stretch_columns của TableLayout thành 0 gây ra hiệu ứng tôi đang tìm kiếm (TextView's ở bên trái, CheckBoxes ở bên phải). Cảm ơn đã 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 của mình một cách linh hoạt, bạn có thể lấy nó như thế này:TextView tv = (TextView) findViewById(R.id.your_textview_inside_the_linearlayout); tv.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 0.1f));
Eric Leschinski

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

nhập android.widget.LinearLayout; nhập android.widget.TableLayout;
Prakash

1
Lưu ý rằng hầu hết mọi người sẽ sử dụng 0 làm tham số thứ nhất hoặc thứ hai (tùy theo chiều ngang hoặc dọc) và không phải WRAP_CONTENT vì những gì họ đang tìm kiếm là để đặt trọng số.
FlorianB

97

Câu trả lời là bạn phải sử dụng TableRow.LayoutParams, không phải là 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ể thay thế cho nhau và nếu bạn sử dụng sai thì dường như không có gì xảy ra. Cha mẹ của khung nhìn văn bản là một hàng của bảng, do đó:

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


Câu trả lời này đã giúp tôi rất nhiều ... TableLayout không hiệu quả với tôi
sham.y

Aw, bạn đã tiết kiệm cho tôi rất nhiều thời gian. Nó được chỉ định ở đâu? Tôi không tìm thấy gì trong tài liệu về bạn không thể trao đổiLayoutParams
Adrien Cadet

TableRow.LayoutParamstôi cũng đã làm công việc đó
Menelaos Kotsollaris

6
Phần quan trọng của câu trả lời này là 0
Leon

Nó sẽ giảm thời gian làm việc của tôi. Tôi đang tìm kiếm điều này trong một thời gian dài. Giải pháp tuyệt vời
SIVAKUMAR.J

38

Trong các câu trả lời trước đó, trọng số được chuyển cho hàm tạo của một đối tượng someLayoutType.LayoutParams mới. Tuy nhiên, trong nhiều trường hợp, việc sử dụng các đối tượng hiện có sẽ thuận tiện hơn - giúp tránh việc xử lý các tham số mà chúng ta không quan tâm.

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

loparams có thể là NULL vì vậy hãy đảm bảo bạn kiểm tra trước khi gọi setLayoutParams ()
AAgg

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

16
TextView txtview = new TextView(v.getContext());
LayoutParams params = new LinearLayout.LayoutParams(0, LayoutParams.WRAP_CONTENT, 1f);
txtview.setLayoutParams(params);

1f được biểu thị là trọng lượng = 1; bạn có thể cung cấp cho 2f hoặc 3f, các chế độ xem sẽ di chuyển theo dấu cách vào không gian


12

chỉ cần đặt tham số bố cục trong bố cục đó 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à biến trọng lượng

đặt widget hoặc bố cục của bạn như

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

Bạn lấy thông tin này ở đâu mà 1f có nghĩa là biến trọng lượng? Bạn có thể cung cấp một liên kết xin vui lòng?
hayonj

@hayonj chỉ cần kiểm tra nguồn của nhà LinearLayout.LayoutParamsxây dựng. Tham số thứ 3 là trọng lượng. Hoặc tài liệu
mente

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

(HOẶC LÀ)

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

1f được giới thiệu là trọng lượng = 1; tùy theo nhu cầu của bạn, bạn có thể đưa ra 2f hoặc 3f, các chế độ xem sẽ di chuyển theo dấu cách vào không gian. Để tạo 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 trọng số cho " Tuyến tính tuyến tính ".

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

8

Điều này sẽ làm việc với bạn

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

param.weight=1.0f;

7

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

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

 lp1.weight=1;

6

Công việc này đối với tôi và tôi hy vọng nó cũng sẽ hiệu quả với bạn

Đặt LayoutParams cho chế độ xem cha trước tiên:

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

sau đó đặt cho TextView (con):

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

1

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

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

1

Sau khi kéo dài 4 giờ. Cuối cùng, mã này đã làm việc cho tôi.

3 cột có liên tiếp.

  TextView serialno = new TextView(UsersActivity.this);
  TextView userId = new TextView(UsersActivity.this);
  TextView name = new TextView(UsersActivity.this);

  serialno.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  userId.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));
  name.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT, 1f));

-1

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

Giải pháp mà tôi đã kết thúc là lồng một tuyến tính tuyến tính trong TableRows, đã tính đến giá trị của chiều rộng của các 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
Để bạn biết trong tương lai, giải pháp là đặt TableRow, Nút1 và Nút2 thành tất cả layout_width=fill_parent, và sau khi thực hiện điều đó, hãy đặt layout_weight=1cho cả nút1 và nút2. Tất cả các yếu tố với fill_parent và layout_ weight = 1 sẽ được cung cấp kích thước bằng nhau khi lạm phát.
edthethird
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.