Android: tại sao không có maxHeight cho Chế độ xem?


184

View có mộtminHeight nhưng bằng cách nào đó đang thiếu một maxHeight:

Những gì tôi đang cố gắng đạt được là có một số mục (lượt xem) lấp đầy a ScrollView. Khi có 1..3 mục tôi muốn hiển thị chúng trực tiếp. Có nghĩa là ScrollViewcó chiều cao của 1, 2 hoặc 3 mục.

Khi có 4 mục trở lên, tôi muốn ScrollViewngừng mở rộng (do đó a maxHeight) và bắt đầu cung cấp cuộn.

Tuy nhiên, không may là không có cách nào để thiết lập a maxHeight. Vì vậy, tôi có thể phải đặt ScrollViewchiều cao của mình theo chương trình là WRAP_CONTENTkhi có 1..3 mục và đặt chiều cao thành 3*sizeOf(View)khi có 4 mục trở lên.

Bất cứ ai có thể giải thích tại sao không có maxHeightcung cấp, khi đã có một minHeight?

(BTW: một số quan điểm, như ImageViewđã maxHeightthực hiện.)


Tôi đã đăng một giải pháp trong chủ đề khác: stackoverflow.com/questions/18425758/ trên
JMPergar

2
Tôi đã tạo ra một giải pháp cho vấn đề này tại chintanrathod.com/ từ
Chintan Rathod

Google loại bỏ maxHeight gây phiền nhiễu và bất tiện. Nhìn vào tất cả những thứ bạn phải làm bây giờ để có được kết quả tương tự.
Ian Wambai

Câu trả lời:


86

Không có giải pháp nào trong số này hoạt động cho những gì tôi cần, đó là một ScrollView được đặt thành quấn_content nhưng có maxHeight để nó sẽ ngừng mở rộng sau một điểm nhất định và bắt đầu cuộn. Tôi chỉ đơn giản là áp đảo phương thức onMeasure trong ScrollView.

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(300, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Điều này có thể không hoạt động trong mọi tình huống, nhưng nó chắc chắn mang lại cho tôi kết quả cần thiết cho bố cục của tôi. Và nó cũng giải quyết các bình luận của madhu.

Nếu một số bố cục xuất hiện bên dưới scrollview thì thủ thuật này sẽ không hoạt động - madhu 5 tháng 3 lúc 4:36


1
Khi nào thì nó không hoạt động? Đây có vẻ là một giải pháp rất sạch sẽ. Làm cho tôi tự hỏi tại sao họ không thực hiện nó vào xml.
Barshe Smet

1
Có thể nó sẽ không hoạt động nếu bạn đặt chiều cao theo cách thủ công là 240. Tôi không buồn kiểm tra chế độ của chế độ xem cuộn vì tôi chỉ cần hỗ trợ 1 chế độ cụ thể (quấn_content).
rít

Có một chỉnh sửa cho câu trả lời này có nội dung 'Nếu một số bố cục xuất hiện bên dưới cuộn xem thì mẹo này sẽ không hoạt động', điều đó không đúng. Tôi có bố cục được căn chỉnh ở cuối trang và bố cục tùy chỉnh này có "android: layout_above = '@ + ...'" luôn đặt bố cục tùy chỉnh phía trên bố cục phía dưới :)
Machine Tribe

70

Để tạo một ScrollViewhoặc ListViewvới maxHeight, bạn chỉ cần tạo một linearLayout trong suốt xung quanh nó với chiều cao của những gì bạn muốn maxHeight trở thành. Sau đó, bạn đặt Chiều cao của ScrollView thành wrap_content. Điều này tạo ra một ScrollView dường như phát triển cho đến khi chiều cao của nó bằng với linearLayout gốc.


3
Điều này rất hữu ích để ngăn hộp thoại có nội dung cuộn mở rộng đến toàn bộ chiều cao của màn hình.
Kyle Ivey

Gợi ý nhỏ sẽ là sử dụng FrameLayout thay vì linearLayout nhưng tôi nghi ngờ nó có vấn đề.
Kyle Ivey

43
Nếu một số bố cục xuất hiện bên dưới scrollview thì thủ thuật này sẽ không hoạt động
Sreedhu Madhu

2
bạn có thể vui lòng cung cấp một số mã? nó không hoạt động với tôi, vì vậy có lẽ tôi đang làm gì đó sai ...
nhà phát triển Android

Sẽ không hoạt động nếu bạn có các nút bên dưới nó. nó sẽ đẩy các nút ra khỏi màn hình
Li Tian Gong

43

Điều này làm việc cho tôi để làm cho nó có thể tùy chỉnh trong xml:

MaxHeightScrollView.java:

public class MaxHeightScrollView extends ScrollView {

private int maxHeight;
private final int defaultHeight = 200;

public MaxHeightScrollView(Context context) {
    super(context);
}

public MaxHeightScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    if (!isInEditMode()) {
        init(context, attrs);
    }
}

public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    if (!isInEditMode()) {
        init(context, attrs);
    }
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    if (!isInEditMode()) {
        init(context, attrs);
    }
}

private void init(Context context, AttributeSet attrs) {
    if (attrs != null) {
        TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
        //200 is a defualt value
        maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, defaultHeight);

        styledAttrs.recycle();
    }
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
}

attr.xml

<declare-styleable name="MaxHeightScrollView">
        <attr name="maxHeight" format="dimension" />
    </declare-styleable>

bố trí ví dụ

<blah.blah.MaxHeightScrollView android:layout_weight="1"
                app:maxHeight="90dp"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content">
                <EditText android:id="@+id/commentField"
                    android:hint="Say Something"
                    android:background="#FFFFFF"
                    android:paddingLeft="8dp"
                    android:paddingRight="8dp"
                    android:gravity="center_vertical"
                    android:maxLines="500"
                    android:minHeight="36dp"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content" />
            </blah.blah.MaxHeightScrollView>

Tạo chế độ xem tùy chỉnh chắc chắn là cách tốt nhất để đạt được điều này.
Bertram Gilfoyle

Và điều này hoạt động nếu bạn có bố trí bên dưới cuộn xem! Hoàn hảo!
Ragaisis

25

(Tôi biết điều này không trực tiếp trả lời câu hỏi nhưng có thể hữu ích cho những người khác đang tìm kiếm chức năng maxHeight)

ConstraintLayout cung cấp chiều cao tối đa cho trẻ em thông qua

app:layout_constraintHeight_max="300dp"
app:layout_constrainedHeight="true" 

hoặc là

app:layout_constraintWidth_max="300dp"
app:layout_constrainedWidth="true" 

Sử dụng mẫu ở đây .


2
Điều này không hoạt động nếu chế độ xem nằm trong một chuỗi dọc (như được chỉ định trong tài liệu ConstraintLayout)
Arno Schoonbee

Cảm ơn bạn về thông tin.
user1506104

8

Tôi đã nhận xét về câu trả lời của whizzle nếu tôi có thể, nhưng nghĩ rằng thật hữu ích khi lưu ý rằng để tôi giải quyết vấn đề này trong bối cảnh chế độ nhiều cửa sổ trong Android N, tôi cần thay đổi mã một chút về điều này:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    if(MeasureSpec.getSize(heightMeasureSpec) > maxHeight) {
        heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
    }
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

Điều này cho phép bố cục thay đổi kích thước nhỏ hơn chiều cao tối đa, nhưng cũng ngăn không cho nó lớn hơn chiều cao tối đa. Tôi đã sử dụng đây là lớp bố cục ghi đè RelativeLayoutvà điều này cho phép tôi tạo một hộp thoại tùy chỉnh với ScrollViewtư cách là phần tử con MaxHeightRelativeLayoutkhông mở rộng toàn bộ chiều cao của màn hình và cũng co lại để phù hợp với kích thước góa phụ nhỏ nhất trong đa cửa sổ cho Android N


4

Không có cách nào để đặt maxHeight. Nhưng bạn có thể đặt Chiều cao.

Để làm điều đó, bạn sẽ cần khám phá chiều cao của từng mục của bạn scrollView. Sau đó, chỉ cần đặt chiều cao cuộn của bạn thành numberOfItens * heightOfItem.

Để khám phá chiều cao của một vật phẩm làm điều đó:

View item = adapter.getView(0, null, scrollView);
item.measure(0, 0);
int heightOfItem = item.getMeasuredHeight();

Để đặt chiều cao, hãy làm điều đó:

// if the scrollView already has a layoutParams:
scrollView.getLayoutParams().height = heightOfItem * numberOfItens;
// or
// if the layoutParams is null, then create a new one.
scrollView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, heightOfItem * numberOfItens));

4

Bao bọc ScrollViewxung quanh đồng bằng của bạn LinearLayoutvới layout_height = "max_height", điều này sẽ làm một công việc hoàn hảo. Trên thực tế, tôi có mã này trong sản xuất từ ​​5 năm qua mà không có vấn đề gì.

<LinearLayout
        android:id="@+id/subsParent"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:gravity="bottom|center_horizontal"
        android:orientation="vertical">

        <ScrollView
            android:id="@+id/subsScroll"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:layout_marginEnd="15dp"
            android:layout_marginStart="15dp">

            <TextView
                android:id="@+id/subsTv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@string/longText"
                android:visibility="visible" />

        </ScrollView>
    </LinearLayout>

1
Giải pháp hoàn hảo thực sự. Khéo léo và đơn giản. Nó phù hợp ngay cả đối với recyclerview.
Alex Belets

3

MaxHeightScrollViewChế độ xem tùy chỉnh của tôi

public class MaxHeightScrollView extends ScrollView {
    private int maxHeight;

    public MaxHeightScrollView(Context context) {
        this(context, null);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        TypedArray styledAttrs =
                context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
        try {
            maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_mhs_maxHeight, 0);
        } finally {
            styledAttrs.recycle();
        }
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (maxHeight > 0) {
            heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
        }
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }
}

style.xml

<declare-styleable name="MaxHeightScrollView">
    <attr name="mhs_maxHeight" format="dimension" />
</declare-styleable>

Sử dụng

<....MaxHeightScrollView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:mhs_maxHeight="100dp"
    >

    ...

</....MaxHeightScrollView>

2

Tôi có một câu trả lời ở đây:

https://stackoverflow.com/a/29178364/1148784

Chỉ cần tạo một lớp mới mở rộng ScrollView và ghi đè onMeasurephương thức của nó .

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        if (maxHeight > 0){
            int hSize = MeasureSpec.getSize(heightMeasureSpec);
            int hMode = MeasureSpec.getMode(heightMeasureSpec);

            switch (hMode){
                case MeasureSpec.AT_MOST:
                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.AT_MOST);
                    break;
                case MeasureSpec.UNSPECIFIED:
                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
                    break;
                case MeasureSpec.EXACTLY:
                    heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.EXACTLY);
                    break;
            }
        }

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

2

Như đã đề cập ở trên, ConstraintLayout cung cấp chiều cao tối đa cho trẻ em thông qua:

app:layout_constraintHeight_max="300dp"
app:layout_constrainedHeight="true"

Ngoài ra, nếu không chắc chắn chiều cao cho một đứa trẻ của ConstraintLayout cho đến khi Ứng dụng chạy, vẫn có cách để làm cho đứa trẻ này tự động điều chỉnh chiều cao có thể thay đổi cho dù nó được đặt ở đâu trong chuỗi dọc.

Ví dụ: chúng ta cần hiển thị hộp thoại dưới cùng với TextView tiêu đề có thể thay đổi, ScrollView có thể thay đổi và TextView chân trang có thể thay đổi. Chiều cao tối đa của hộp thoại là 320dp khi tổng chiều cao không đạt 320dp ScrollView đóng vai trò là quấn_content, khi tổng chiều cao vượt quá ScrollView đóng vai trò là "maxHeight = 320dp - chiều cao tiêu đề - chiều cao chân trang".

Chúng ta có thể đạt được điều này chỉ thông qua tập tin bố trí xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="320dp">

    <TextView
        android:id="@+id/tv_header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black_10"
        android:gravity="center"
        android:padding="10dp"
        app:layout_constraintBottom_toTopOf="@id/scroll_view"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="1"
        app:layout_constraintVertical_chainStyle="packed"
        tools:text="header" />

    <ScrollView
        android:id="@+id/scroll_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black_30"
        app:layout_constrainedHeight="true"
        app:layout_constraintBottom_toTopOf="@id/tv_footer"
        app:layout_constraintHeight_max="300dp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/tv_header">

        <LinearLayout
            android:id="@+id/ll_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <TextView
                android:id="@+id/tv_sub1"
                android:layout_width="match_parent"
                android:layout_height="160dp"
                android:gravity="center"
                android:textColor="@color/orange_light"
                tools:text="sub1" />

            <TextView
                android:id="@+id/tv_sub2"
                android:layout_width="match_parent"
                android:layout_height="160dp"
                android:gravity="center"
                android:textColor="@color/orange_light"
                tools:text="sub2" />

        </LinearLayout>
    </ScrollView>

    <TextView
        android:id="@+id/tv_footer"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/black_50"
        android:gravity="center"
        android:padding="10dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/scroll_view"
        tools:text="footer" />
</android.support.constraint.ConstraintLayout>

Hầu hết các mã nhập khẩu là ngắn:

app:layout_constraintVertical_bias="1"
app:layout_constraintVertical_chainStyle="packed"

app:layout_constrainedHeight="true"

Cách sử dụng maxWidth ngang hoàn toàn giống nhau.


1

Bạn đã thử sử dụng giá trị layout_ weight chưa chưa? Nếu bạn đặt giá trị đó thành giá trị lớn hơn 0, nó sẽ kéo dài chế độ xem đó vào không gian còn lại có sẵn.

Nếu bạn có nhiều chế độ xem cần được kéo dài, thì giá trị sẽ trở thành trọng số giữa chúng.

Vì vậy, nếu bạn có hai chế độ xem được đặt thành giá trị layout_ weight là 1, thì cả hai sẽ kéo dài để lấp đầy khoảng trống nhưng cả hai sẽ kéo dài đến một khoảng trống bằng nhau. Nếu bạn đặt một trong số chúng thành giá trị là 2, thì nó sẽ kéo dài gấp đôi so với chế độ xem khác.

Một số thông tin ở đây được liệt kê dưới Bố cục tuyến tính.


1
Vấn đề với các trọng số là chúng tương đối. Kích thước màn hình khác nhau, kết quả khác nhau, ví dụ với màn hình 800px tôi có thể đặt trọng số thành một giá trị nhất định, để một khu vực cụ thể kết thúc với 200px mong muốn. Tuy nhiên, với màn hình 850px, khu vực cụ thể kết thúc lớn hơn 200px, nhưng các yếu tố kèm theo vẫn chỉ là 200px. Đó là lý do tại sao tôi thích có một maxHeightgiá trị mà tôi có thể đặt thành một giá trị nhúng cụ thể. (Cuối cùng tôi đã kết thúc để tính toán và thiết lập độ cao theo chương trình)
znq

1

Tôi nghĩ rằng bạn có thể thiết lập heiht trong thời gian chạy cho 1 mục chỉ scrollView.setHeight(200px), cho 2 mục scrollView.setheight(400px)cho 3 hoặc nhiều hơnscrollView.setHeight(600px)


8
Bạn không muốn đặt Kích thước trong 'px'. Rất có khả năng bạn không nhận được kết quả bạn muốn trên nhiều Thiết bị. developer.android.com/guide/topics/resource/ từ
Hernd DerBeld

@HerndDerBeld đó là cách nó hoạt động trong mã. nếu bạn muốn, bạn luôn có thể chuyển đổi từ DP sang pixel khá dễ dàng: float pixel = TypedValue.applyDimension (TypedValue.COMPLEX_UNIT_DIP, dp, context.getResource () .getDisplayMetrics ());
nhà phát triển Android

1

Như chúng ta đã biết các thiết bị chạy Android có thể có kích thước màn hình khác nhau. Như chúng ta biết thêm, các khung nhìn nên điều chỉnh linh hoạt và trở thành không gian phù hợp.

Nếu bạn đặt chiều cao tối đa, bạn có thể buộc chế độ xem không có đủ không gian hoặc mất ít không gian hơn. Tôi biết rằng đôi khi nó thực tế để thiết lập một chiều cao tối đa. Nhưng nếu độ phân giải sẽ thay đổi đáng kể, và nó sẽ!, Thì chế độ xem có chiều cao tối đa sẽ trông không phù hợp.

Tôi nghĩ rằng không có cách thích hợp để thực hiện chính xác bố cục bạn muốn. Tôi sẽ khuyên bạn nên suy nghĩ về cách bố trí của bạn bằng cách sử dụng trình quản lý bố cục và các cơ chế tương đối. Tôi không biết bạn đang cố gắng đạt được điều gì nhưng nghe có vẻ hơi lạ đối với tôi rằng một danh sách chỉ nên hiển thị ba mục và sau đó người dùng phải cuộn.

btw. minHeight không được bảo đảm (và có lẽ không nên tồn tại). nó có thể có một số lợi ích để buộc các mục được hiển thị trong khi các mục tương đối khác trở nên nhỏ hơn.


6
Cái này sai. Theo logic này, bạn cũng sẽ không thể nói android: layout_creen = "500dp".
Glenn Maynard

Tôi không thấy những gì nên sai cũng không phải là sự giải thích logic của bạn. Nếu bạn đặt layout_creen (đôi khi vẫn ổn), điều đó không đảm bảo bạn sẽ có được điều đó. 500dp có thể nhìn trên một thiết bị phù hợp, trên một thiết bị khác thì không. Quản lý bố trí ftw! Có lẽ bạn có thể giải thích thêm bcs những người bỏ phiếu xuống :)
Diego Frehner

3
Nó chỉ hợp lệ khi nói android: maxWidth = "500dp" như nói android: layout_creen = "500dp". Cả hai lực lượng kích thước cụ thể trên xem.
Glenn Maynard

1

Nếu bất cứ ai đang xem xét sử dụng giá trị chính xác cho LayoutParams, vd

setLayoutParams(new LayoutParams(Y, X );

Hãy nhớ tính đến mật độ của màn hình thiết bị nếu không bạn có thể có hành vi rất kỳ quặc trên các thiết bị khác nhau. Ví dụ:

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics d = new DisplayMetrics();
display.getMetrics(d);
setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, (int)(50*d.density) ));

0

Đầu tiên hãy lấy chiều cao của vật phẩm bằng pixel

View rowItem = adapter.getView(0, null, scrollView);   
rowItem.measure(0, 0);    
int heightOfItem = rowItem.getMeasuredHeight();

sau đó đơn giản

Display display = getWindowManager().getDefaultDisplay();    
DisplayMetrics displayMetrics = new DisplayMetrics();    
display.getMetrics(displayMetrics);    
scrollView.getLayoutParams().height = (int)((heightOfItem * 3)*displayMetrics .density);

0

nếu các bạn muốn tạo một scrollview hoặc listview không tràn, nhưng chỉ trên RelativeLayout với một topview và bottomview ở trên và dưới cho nó:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/topview"
    android:layout_below="@+id/bottomview" >

Điều này cần tín dụng nhiều hơn. Cụ thể nhưng thực hiện đơn giản.
Luke Allison

0

Tôi đã sử dụng một ScrollView tùy chỉnh được thực hiện trong Kotlin sử dụng maxHeight. Ví dụ sử dụng:

<com.antena3.atresplayer.tv.ui.widget.ScrollViewWithMaxHeight
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxHeight="100dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</com.antena3.atresplayer.tv.ui.widget.ScrollViewWithMaxHeight>

Đây là mã của ScrollViewWidthMaxHeight:

import android.content.Context
import android.util.AttributeSet
import android.widget.ScrollView
import timber.log.Timber

class ScrollViewWithMaxHeight @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : ScrollView(context, attrs, defStyleAttr) {

companion object {
    var WITHOUT_MAX_HEIGHT_VALUE = -1
}

private var maxHeight = WITHOUT_MAX_HEIGHT_VALUE

init {
    val a = context.obtainStyledAttributes(
        attrs, R.styleable.ScrollViewWithMaxHeight,
        defStyleAttr, 0
    )
    try {
        maxHeight = a.getDimension(
            R.styleable.ScrollViewWithMaxHeight_android_maxHeight,
            WITHOUT_MAX_HEIGHT_VALUE.toFloat()
        ).toInt()
    } finally {
        a.recycle()
    }
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    var heightMeasure = heightMeasureSpec
    try {
        var heightSize = MeasureSpec.getSize(heightMeasureSpec)
        if (maxHeight != WITHOUT_MAX_HEIGHT_VALUE) {
            heightSize = maxHeight
            heightMeasure = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.AT_MOST)
        } else {
            heightMeasure = MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.UNSPECIFIED)
        }
        layoutParams.height = heightSize
    } catch (e: Exception) {
        Timber.e(e, "Error forcing height")
    } finally {
        super.onMeasure(widthMeasureSpec, heightMeasure)
    }
}

fun setMaxHeight(maxHeight: Int) {
    this.maxHeight = maxHeight
}
}

cũng cần tuyên bố này trong values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScrollViewWithMaxHeight">
        <attr name="android:maxHeight" />
    </declare-styleable>
</resources>
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.