Làm cách nào để đặt thuộc tính layout_ weight tự động từ mã?


244

Làm cách nào tôi có thể thiết lập giá trị cho thuộc tính layout_weightcho nút trong Android từ mã java?


Nó sẽ rất giống với câu hỏi / câu trả lời này: stackoverflow.com/questions/4638832/ và cái này: stackoverflow.com/questions/4637233/ Lỗi
Người lập kế hoạch giàu có

Nếu bạn đã xác định chế độ xem trong tệp bố cục (xml), thì việc tạo Bố cục mới sẽ ghi đè các tham số khác được xác định trong tệp xml. Vì vậy, trước tiên bạn nên sử dụng "getLayoutParams". Xem câu trả lời đầy đủ stackoverflow.com/questions/4641072/ khăn
Shirish Herwade

Câu trả lời:


461

Bạn có thể truyền nó vào như một phần của hàm LinearLayout.LayoutParamstạo:

LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
    LayoutParams.MATCH_PARENT,
    LayoutParams.MATCH_PARENT,
    1.0f
);
YOUR_VIEW.setLayoutParams(param);

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


2
Nó nên làparam = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, (float) 1.0);
Mithun Sreedharan

49
Nếu bạn không muốn chuyển từ gấp đôi thành phao, chỉ cần đặt 1.0f
Xample

8
Hoặc thậm chí đơn giản hơn 1fnếu không có vị trí thập phân
cá cát

4
Relative
Phải

9
@pratik nếu bố trí cha mẹ là tương đối bạn không sử dụng trọng số
invertigo

121

Sử dụng LinearLayout.LayoutParams:

LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
    LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT);
params.weight = 1.0f;
Button button = new Button(this);
button.setLayoutParams(params);

EDIT: Ah, câu trả lời của Erich dễ dàng hơn!


27
Anser của Erich có thể dễ viết hơn, nhưng của bạn thì dễ đọc hơn. Vì nó cho biết thuộc tính nào 1.0f được sử dụng cho.
Johan

3
của bạn được thiết lập để bạn có thể sửa đổi trọng lượng một cách nhanh chóng bằng cách gọi 'view.getLayoutParams ()' sau đó sửa đổi giá trị.
RobGThai

1
FILL_PARENTđã được phản đối và MATCH_PARENTnên được sử dụng thay thế.
Simon Forsberg

2
@LocalPCGuy Không đúng. Miễn là bạn đang nhắm mục tiêu SDK> = 8 (mà bạn hoàn toàn nên có), MATCH_PARENTcó thể được sử dụng thay vì FILL_PARENTngay cả trên các thiết bị cũ hơn.
Kevin Coppock

2
@LocalPCGuy Không ai sử dụng API 7 trở xuống nữa . Nếu bạn đang cố gắng để làm cho ứng dụng của bạn tương thích với các API 7 hoặc ít hơn, bạn có thể muốn chạy vào một toàn bộ rất nhiều vấn đề khác trước khi lo lắng về FILL_PARENTvs MATCH_PARENT.
Simon Forsberg

82

Nếu bạn đã xác định chế độ xem trong tệp bố cục (xml) của mình, chỉ muốn thay đổi trọng số theo chương trình, cách này sẽ tốt hơn

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams)   
mButton.getLayoutParams();
params.weight = 1.0f;
mButton.setLayoutParams(params);

một LayoutParams mới ghi đè lên các thông số khác được xác định trong tệp xml của bạn như lề hoặc bạn cần chỉ định tất cả chúng trong LayoutParams.


2
Với "params. weight = 1f;" bạn đã thiết lập trọng số cho đối tượng LayoutParams. Không cần phải gọi "mButton.setLayoutParams (params);".
MrMaffen 28/03/2015

2
Không, bạn phải gọi setLayoutParams
SIr Codealot

1
Đây thực sự là câu trả lời tao nhã nhất và nó trực tiếp thay đổi một đối tượng UI cụ thể. Câu trả lời tốt nhất là tốt quá và cũ hơn bài này. Vì vậy, nó xứng đáng là câu trả lời tốt nhất. Tôi ủng hộ bài này mặc dù.
Android gốc

Giải pháp tuyệt vời và đơn giản!
Jeremy

Hoạt động như một lá bùa! Cảm ơn rất nhiều :)
Vinay Vissh

26

Nếu hàm tạo có chiều rộng, chiều cao và trọng lượng không hoạt động, hãy thử sử dụng hàm tạo có chiều rộng và chiều cao. Và sau đó tự đặt trọng lượng.

Và nếu bạn muốn chiều rộng được đặt theo trọng số, hãy đặt chiều rộng là 0 trong hàm tạo. Áp dụng tương tự cho chiều cao. Mã dưới đây làm việc cho tôi.

LinearLayout.LayoutParams childParam1 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam1.weight = 0.3f;
child1.setLayoutParams(childParam1);

LinearLayout.LayoutParams childParam2 = new LinearLayout.LayoutParams(0,LinearLayout.LayoutParams.MATCH_PARENT);
childParam2.weight = 0.7f;
child2.setLayoutParams(childParam2);

parent.setWeightSum(1f);
parent.addView(child1);
parent.addView(child2);

Đúng thứ tôi cần! Mọi người đang nói về việc thiết lập trọng lượng ở đây, không ai hiển thị điều gì xảy ra khi những đứa trẻ nặng cân đó được thêm vào Chế độ xem của phụ huynh! Tôi thực sự đang tìm cách thêm weightSum trên ParentView! Cảm ơn!
sud007 17/03/2016

14

Nếu tôi có ai đó đang tìm kiếm câu trả lời, hãy sử dụng điều này:

LinearLayout.LayoutParams lay = (LinearLayout.LayoutParams) myLayout.getLayoutParams();
lay.weight = 0.5;

Nếu bạn đang khởi tạo bố cục của mình từ tệp xml, điều này sẽ thuận tiện hơn nhiều so với việc cung cấp các tham số bố cục mới cho Bố cục tuyến tính.


Đây phải là câu trả lời được chấp nhận vì nó không sửa đổi bất kỳ biến nào được đặt trước đó như chiều rộng / chiều cao / lề / phần đệm, v.v. Mọi thứ đang được giữ và sử dụng lại trong khi trọng lượng được thay đổi.
MrMaffen 28/03/2015

1
Nếu chế độ xem cần thiết layout_weightđã được đặt ra, bạn cần gọi View.requestLayout()để cập nhật.
Tấn công

6

Bất kỳ LinearLayout.LayoutParamsTableLayout.LayoutParamslàm việc cho tôi, cho các nút bên phải là TableRow.LayoutParams. Đó là:

            TableRow.LayoutParams buttonParams = new TableRow.LayoutParams(
                    TableRow.LayoutParams.MATCH_PARENT,
                    TableRow.LayoutParams.WRAP_CONTENT, 1f);

Về việc sử dụng MATCH_PARENThoặc WRAP_CONTENTlà như nhau.


3
FILL_PARENTđã được phản đối và MATCH_PARENTnên được sử dụng thay thế.
Simon Forsberg

Tôi nghĩ rằng LayoutParams.MATCH_PARENT nên được đổi thành 0.
CoolMind

Bạn gọi cho LayoutParamscha mẹ trực tiếp. Tôi giả sử bạn đã gặp sự cố khi cố gắng sử dụng LinearLayout.LayoutParamsmà không có cha mẹ LinearLayout.
Giỏ hàng bị bỏ rơi

4

Nếu bạn đã xác định chế độ xem của mình trong tệp bố cục (xml) và chỉ muốn thay đổi trọng số theo ngữ pháp, thì sau đó tạo Bố cục mới sẽ ghi đè các tham số khác được xác định trong tệp xml của bạn.

Vì vậy, trước tiên bạn nên sử dụng "getLayoutParams" và sau đó đặtLayoutParams

LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mButton.getLayoutParams(); params.weight = 4f; mButton.setLayoutParams(params);


3

Nếu layoutparamsđã được xác định (bằng XML hoặc động), đây là một lớp lót:

((LinearLayout.LayoutParams) mView.getLayoutParams()).weight = 1;

Câu trả lời không thể chối cãi
Adam Higgins

0

Sử dụng Kotlin bạn có thể làm một cái gì đó như:

import android.content.Context
import android.support.v4.content.ContextCompat
import android.support.v7.widget.CardView
import android.widget.*

import android.widget.LinearLayout

class RespondTo : CardView {
    constructor(context: Context) : super(context) {
        init(context)
    }

    private fun init(context: Context) {


        val parent = LinearLayout(context)

        parent.apply {
            layoutParams = LinearLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT,
                    FrameLayout.LayoutParams.WRAP_CONTENT, 1.0f).apply {
                orientation = LinearLayout.HORIZONTAL

                addView(EditText(context).apply {
                    id = generateViewId()
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.9f).apply {
                    }
                })
                addView(ImageButton(context).apply({
                    layoutParams = LinearLayout.LayoutParams(0,
                            LinearLayout.LayoutParams.WRAP_CONTENT, 0.1f)
                    background = null
                    setImageDrawable(ContextCompat.getDrawable(context, R.drawable.ic_save_black_24px))
                    id = generateViewId()
                    layoutParams = RelativeLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                            LinearLayout.LayoutParams.WRAP_CONTENT).apply {
                        addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
                        // addRule(RelativeLayout.LEFT_OF, myImageButton.id)
                    }
                }))
            }
        }
        this.addView(parent)
    }
}
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.