Làm thế nào để thay đổi kích thước một khung nhìn tùy chỉnh theo chương trình?


164

Tôi đang mã hóa chế độ xem tùy chỉnh, được mở rộng từ RelativeLayout và tôi muốn thay đổi kích thước của chương trình, tôi phải làm thế nào?

Lớp xem tùy chỉnh là một cái gì đó như:

public ActiveSlideView(Context context, AttributeSet attr){
        super(context, attr);
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(inflater != null){       
            inflater.inflate(R.layout.active_slide, this);
        }

Câu trả lời:


253

Android ném một ngoại lệ nếu bạn không vượt qua chiều cao hoặc chiều rộng của chế độ xem. Thay vì tạo một đối tượng LayoutParams mới, hãy sử dụng đối tượng ban đầu để giữ tất cả các tham số thiết lập khác. Lưu ý rằng loại LayoutParams được getLayoutParams trả về là kiểu bố trí cha mẹ , không phải dạng xem bạn đang thay đổi kích thước.

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) someLayout.getLayoutParams();
params.height = 130;
someLayout.setLayoutParams(params);

2
Như @HerbertD đề cập, tôi cũng gặp lỗi khi thực hiện việc này trừ khi tôi sử dụng linearLayout.LayoutParams, thậm chí thông qua đó là RelativeLayout mà tôi đang thay đổi kích thước.
Martin Belcher - AtWrk

6
@Eigo Theo tài liệu của Android, LayoutParams được chuyển đến Chế độ xem chính, vì đây là chế độ xem chịu trách nhiệm cho bố cục.
sstn

1
Cho dù giá trị trong nên được chuyển đổi thành giá trị dp hay nó sẽ hoạt động.
Dory

Điều này cũng tốt hơn vì nó tránh việc khởi tạo một đối tượng LayoutParams mới một cách không cần thiết
Stephen Kidson

129
this.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, theSizeIWant));

Vấn đề được giải quyết!

LƯU Ý: Đảm bảo sử dụng Bố cục của bố mẹ LayoutParams. Của tôi là LinearLayout.LayoutParams!


3
Wut. Tại sao bạn không sử dụngRelativeLayout.LayoutParams?
nmr

1
Điều này không làm việc cho tôi, tôi có một ngoại lệ lớp học cho nó.
Tapan Thaker

4
@Tapan Thanker Sử dụng LayoutParams của Parent layout. Và bố trí của cha mẹ tôi là linearLayout.
herbertD

10
Tôi đã viết một phiên bản chung hơn về điều này: private void resizeView(View view, int newWidth, int newHeight) { try { Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); view.setLayoutParams(ctor.newInstance(newWidth, newHeight)); } catch (Exception e) { e.printStackTrace(); } }
vào

2
Điều này sẽ đặt lại tất cả các tham số khác về giá trị mặc định. @smisiewicz trả lời là tốt hơn.
Fran Marzoa

66

Điều này làm việc cho tôi:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

7
Điều này tốt hơn nhiều so với các câu trả lời khác vì mã này không yêu cầu phải biết chính xác loại Viewgroup chính.
Bart Burg

1
Bạn có biết sự khác biệt giữa cách gọi requestLayout () và gọi setLayoutParams (params) không?
voghDev

2
setLayoutParams (params) bao gồm requestLayout ().
ảo

44

Để biết giá trị của nó, giả sử bạn muốn thay đổi kích thước chế độ xem trong các pixel độc lập của thiết bị ( dp ): -

Bạn cần sử dụng một phương thức được gọi là applyDimensionthành viên của lớp TypedValueđể chuyển đổi từ pixel sang dps. Vì vậy, nếu tôi muốn đặt chiều cao thành 150dp (giả sử) - thì tôi có thể làm điều này:

float pixels = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150, getResources().getDisplayMetrics());
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) someLayout.getLayoutParams();
params.height = (int) pixels;
someLayout.setLayoutParams(params);

Trong đó biểu thức: getResources().getDisplayMetrics()lấy mật độ / độ phân giải màn hình


6
Thay vì mã hóa cứng kích thước của bạn, bạn cũng có thể sử dụng kích thước này cho chiều cao tính bằng pixel:float pixels = context.getResources().getDimensionPixelSize(R.dimen.card_height);
Francois Dermu

câu trả lời này thích hợp hơn là một câu trả lời đúng!. Cảm ơn
Yunus Kulyyev


6

hãy thử cái này

...
View view = inflater.inflate(R.layout.active_slide, this);
view.setMinimumWidth(200);

Xin lỗi tôi đã không đăng tất cả các câu hỏi kể từ khi bạn trả lời nó. Bây giờ đó là toàn bộ câu hỏi. Cảm ơn!
herbertD

6

Đây là phiên bản chung hơn của giải pháp ở trên từ @herbertD:

private void resizeView(View view, int newWidth, int newHeight) { 
    try { 
        Constructor<? extends LayoutParams> ctor = view.getLayoutParams().getClass().getDeclaredConstructor(int.class, int.class); 
        view.setLayoutParams(ctor.newInstance(newWidth, newHeight));   
    } catch (Exception e) { 
        e.printStackTrace(); 
    }
}

@atroutt, bạn thực sự đã cứu ngày của tôi :)
Qasim

5

Tôi đã sử dụng cách này để tăng chiều rộng của chế độ xem tùy chỉnh

customDrawingView.post(new Runnable() {
                            @Override
                            public void run() {
                                View view_instance = customDrawingView;
                                android.view.ViewGroup.LayoutParams params = view_instance
                                        .getLayoutParams();
                                int newLayoutWidth = customDrawingView
                                        .getWidth()
                                        + customDrawingView.getWidth();
                                params.width = newLayoutWidth;
                                view_instance.setLayoutParams(params);
                                screenWidthBackup = params.width;
                            }
                        });

4

Tôi đã giải quyết nó theo cách này .. về cơ bản tôi có một chế độ xem đơn giản bên trong tệp xml.

 View viewname = findViewById(R.id.prod_extra);
             prodExtra.getLayoutParams().height=64;

2
haha, cách rất ngây thơ nhưng hoạt động tốt, tuy nhiên tôi khuyên bạn nên gọi setLayoutParams () cuối cùng để truyền đúng sự thay đổi cho những đứa trẻ lồng nhau có thể, vì vậy sau khi cập nhật. luôn luôn gõ bằng chứng
comeGetSome 2/12/2016

@Bhargav Rao bạn có thể giúp tôi về chủ đề này: https://stackoverflow.com/q/44259342/6596724
tux-world

2

Nếu bạn chỉ có two or three condition(sizes)thì bạn có thể sử dụng @Overide onMeasure như

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Và thay đổi kích thước của bạn cho các điều kiện này trong lớp CustomView một cách dễ dàng.


1

nếu bạn đang ghi đè onMeasure, đừng quên cập nhật kích thước mới

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    setMeasuredDimension(newWidth, newHeight);
}

1

Đây là cách tôi đạt được điều này. Trong câu trả lời của Sileria , anh ấy / cô ấy đã làm như sau:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = customHeight;
layout.requestLayout();

Điều này là chính xác, nhưng nó hy vọng chúng ta sẽ cho chiều cao pixels, nhưng tôi muốn cho dpchiều cao tôi muốn vì vậy tôi đã thêm:

public int convertDpToPixelInt(float dp, Context context) {
    return (int) (dp * (((float) context.getResources().getDisplayMetrics().densityDpi) / 160.0f));
}

Vì vậy, nó sẽ trông như thế này:

ViewGroup.LayoutParams params = layout.getLayoutParams();
params.height = convertDpToPixelInt(50, getContext());
layout.requestLayout();

0

Đây là những gì tôi đã làm:

View myView;  
myView.getLayoutParams().height = 32;  
myView.getLayoutParams().width = 32;

Nếu có một nhóm chế độ xem mà chế độ xem này thuộc về, bạn cũng có thể cần gọi yourViewgroup.requestLayout () để nó có hiệu lực.

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.