Android: mengapa tidak ada maxHeight untuk Tampilan?

184

Lihat punyaminHeight tapi entah bagaimana kurang maxHeight:

Yang ingin saya capai adalah mengisi beberapa item (tampilan) ScrollView. Ketika ada 1..3 item yang ingin saya tampilkan secara langsung. Berarti ScrollViewmemiliki ketinggian 1, 2 atau 3 item.

Ketika ada 4 atau lebih item yang saya ingin ScrollViewberhenti berkembang (jadi a maxHeight) dan mulai menyediakan scrolling.

Namun, sayangnya tidak ada cara untuk mengatur maxHeight. Jadi saya mungkin harus mengatur ScrollViewtinggi badan saya secara terprogram baik WRAP_CONTENTketika ada 1..3 item dan mengatur ketinggian 3*sizeOf(View)ketika ada 4 atau lebih item.

Adakah yang bisa menjelaskan mengapa tidak ada yang maxHeightdisediakan, padahal sudah ada minHeight?

(BTW: beberapa tampilan, seperti ImageViewtelah maxHeightditerapkan.)

znq
sumber
Saya telah memposting solusi di utas lain: stackoverflow.com/questions/18425758/…
JMPergar
2
Saya telah membuat solusi untuk ini di chintanrathod.com/…
Chintan Rathod
Google menghapus maxHeight menjengkelkan dan tidak nyaman. Lihatlah semua hal yang harus Anda lakukan sekarang untuk mendapatkan hasil yang sama.
Ian Wambai

Jawaban:

86

Tak satu pun dari solusi ini bekerja untuk apa yang saya butuhkan yaitu set ScrollView untuk wrap_content tetapi memiliki maxHeight sehingga akan berhenti berkembang setelah titik tertentu dan mulai menggulir. Saya hanya cukup mengesampingkan metode onMeasure di ScrollView.

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

Ini mungkin tidak berfungsi di semua situasi, tetapi tentu saja memberi saya hasil yang diperlukan untuk tata letak saya. Dan itu juga membahas komentar oleh madhu.

Jika beberapa tata letak ada di bawah scrollview maka trik ini tidak akan berfungsi - madhu 5 Maret jam 4:36

mendesis
sumber
1
Kapan ini tidak berhasil? Ini sepertinya solusi yang sangat bersih. Buat saya bertanya-tanya mengapa mereka tidak mengimplementasikannya ke xml.
Christophe Smet
1
Mungkin tidak akan berfungsi jika Anda secara manual mengatur ketinggian untuk mengatakan 240. Saya tidak repot-repot memeriksa mode scrollview ini karena saya hanya perlu mendukung 1 mode khusus (wrap_content).
Whizzle
Ada edit untuk jawaban ini yang mengatakan 'Jika beberapa tata letak ada di bawah scrollview maka trik ini tidak akan berhasil', yang tidak benar. Saya memiliki tata letak yang disejajarkan dengan bagian bawah halaman dan tata letak khusus ini memiliki "android: layout_above = '@ + ...'" yang selalu menempatkan tata letak kustom di atas tata letak bawah :)
Machine Tribe
70

Untuk membuat ScrollViewatau ListViewdengan maxHeight, Anda hanya perlu membuat LinearLayout transparan di sekitarnya dengan ketinggian yang Anda inginkan dengan maxHeight. Anda kemudian mengatur Tinggi ScrollView ke wrap_content. Ini menciptakan ScrollView yang tampaknya tumbuh sampai tingginya sama dengan induknya LinearLayout.

JustinMorris
sumber
3
Ini berguna untuk mencegah dialog dengan konten gulir dari memperluas ke ketinggian penuh layar.
Kyle Ivey
Saran kecil akan menggunakan FrameLayout bukan LinearLayout tapi saya ragu itu penting.
Kyle Ivey
43
Jika beberapa tata letak ada di bawah scrollview maka trik ini tidak akan berhasil
Sreedhu Madhu
2
dapatkah Anda memberikan beberapa kode? itu tidak berhasil untuk saya, jadi mungkin saya melakukan sesuatu yang salah ...
pengembang android
tidak akan berfungsi jika Anda memiliki tombol di bawahnya. itu akan menekan tombol dari layar
Li Tian Gong
43

Ini berfungsi agar saya dapat dikustomisasi dalam 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>

tata letak contoh

<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>
SlickDev
sumber
Membuat tampilan khusus jelas merupakan cara terbaik untuk mencapai ini.
Bertram Gilfoyle
Dan ini berfungsi jika Anda memiliki tata letak di bawah tampilan gulir! Sempurna!
Ragaisis
25

(Saya tahu ini tidak langsung menjawab pertanyaan tetapi mungkin bermanfaat bagi orang lain yang mencari fungsionalitas maxHeight)

ConstraintLayout menawarkan tinggi maksimum untuk anak-anaknya via

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

atau

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

Contoh penggunaan di sini .

pengguna1506104
sumber
2
Ini tidak berfungsi jika tampilan berada dalam rantai vertikal (seperti yang ditentukan dalam dokumen ConstraintLayout)
Arno Schoonbee
Terimakasih atas infonya.
user1506104
8

Saya akan mengomentari jawaban whizzle jika saya bisa, tetapi saya pikir ini berguna untuk mencatat bahwa agar saya dapat menyelesaikan masalah ini dalam konteks mode multi-jendela di Android N, saya perlu mengubah sedikit kode untuk ini:

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

Ini memungkinkan tata letak untuk mengubah ukuran menjadi lebih kecil dari ketinggian maks, tetapi juga mencegahnya agar tidak lebih besar dari ketinggian maks. Saya menggunakan ini adalah kelas tata letak yang Overrides RelativeLayoutdan ini memungkinkan saya untuk membuat dialog khusus dengan ScrollViewsebagai anak MaxHeightRelativeLayoutyang tidak memperluas ketinggian penuh layar dan juga menyusut agar sesuai dengan ukuran janda terkecil di multi-jendela untuk Android N.

JP Krause
sumber
4

Tidak ada cara untuk mengatur maxHeight. Tapi Anda bisa mengatur Tinggi.

Untuk melakukan itu, Anda perlu menemukan ketinggian setiap item Anda scrollView. Setelah itu cukup atur tinggi scrollView Anda ke numberOfItens * heightOfItem.

Untuk menemukan ketinggian item, lakukan itu:

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

Untuk mengatur ketinggian lakukan itu:

// 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));
Derzu
sumber
4

Membungkus Anda di ScrollViewsekitar dataran Anda LinearLayoutdengan layout_height = "max_height", ini akan melakukan pekerjaan dengan sempurna. Sebenarnya, saya memiliki kode ini dalam produksi dari 5 tahun terakhir dengan nol masalah.

<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>
Sai
sumber
1
Solusi sempurna memang. Pintar dan sederhana. Sangat cocok bahkan untuk recyclerview.
Alex Belets
3

MaxHeightScrollViewTampilan kustom saya

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>

Menggunakan

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

    ...

</....MaxHeightScrollView>
Phan Van Linh
sumber
2

Saya punya jawaban di sini:

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

Cukup buat kelas baru dengan memperluas ScrollView dan timpa onMeasuremetode itu.

    @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);
    }
babay
sumber
2

Seperti yang disebutkan di atas, ConstraintLayout menawarkan tinggi maksimum untuk anak-anaknya melalui:

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

Selain itu, jika tinggi maksimum untuk satu anak ConstraintLayout tidak pasti hingga Aplikasi berjalan, masih ada cara untuk membuat anak ini secara otomatis menyesuaikan ketinggian yang bisa berubah di mana pun ia ditempatkan dalam rantai vertikal.

Sebagai contoh, kita perlu memperlihatkan dialog bawah dengan header TextView yang dapat diubah, ScrollView yang bisa berubah, dan footer yang bisa diubah TextView. Tinggi maks dialog adalah 320dp , ketika tinggi total tidak mencapai 320dp ScrollView bertindak sebagai wrap_content, ketika tinggi total melebihi ScrollView bertindak sebagai "maxHeight = 320dp - tinggi header - tinggi footer".

Kita dapat mencapai ini hanya melalui file layout 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>

Sebagian besar kode impor pendek:

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

app:layout_constrainedHeight="true"

Penggunaan horisontal maxWidth cukup sama.

xionghg
sumber
1

Sudahkah Anda mencoba menggunakan nilai layout_weight ? Jika Anda menetapkan satu ke nilai lebih besar dari 0, itu akan meregangkan pandangan itu ke dalam ruang yang tersisa yang tersedia.

Jika Anda memiliki beberapa tampilan yang perlu diregangkan, maka nilainya akan menjadi beban di antara keduanya.

Jadi jika Anda memiliki dua tampilan, keduanya diatur ke nilai layout_weight dari 1, maka keduanya akan meregangkan untuk mengisi ruang, tetapi keduanya akan membentang ke jumlah ruang yang sama. Jika Anda menetapkan salah satu dari mereka ke nilai 2, maka itu akan meregangkan dua kali lipat dari pandangan lainnya.

Beberapa info lebih lanjut di sini tercantum di bawah Layout Linear.

Bryan Denny
sumber
1
Masalah dengan bobot adalah bobotnya relatif. Ukuran layar yang berbeda, hasil yang berbeda, misalnya dengan layar 800px saya dapat mengatur bobot ke nilai tertentu, sehingga area tertentu berakhir dengan 200px yang diinginkan. Namun, dengan layar 850px area spesifik berakhir menjadi lebih besar dari 200px, tetapi elemen tertutup masih hanya 200px. Itu sebabnya saya lebih suka memiliki maxHeightyang saya dapat mengatur ke nilai penurunan tertentu. (Saya akhirnya selesai menghitung dan mengatur ketinggian secara programatis)
znq
1

saya pikir Anda dapat mengatur heiht saat runtime untuk 1 item saja scrollView.setHeight(200px), untuk 2 item scrollView.setheight(400px)untuk 3 atau lebihscrollView.setHeight(600px)

Yayo28
sumber
8
Anda tidak ingin mengatur Dimensi dalam 'px'. Sangat mungkin bahwa Anda tidak mendapatkan hasil yang Anda inginkan di beberapa Perangkat. developer.android.com/guide/topics/resources/…
Hernd DerBeld
@HerndDerBeld begitulah cara kerjanya dalam kode. jika diinginkan, Anda selalu dapat dengan mudah mengkonversi dari DP ke piksel: float piksel = TypedValue.applyDimension (TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources () .getDisplayMetrics ());
pengembang android
1

Seperti yang kita ketahui perangkat yang menjalankan Android dapat memiliki ukuran layar yang berbeda. Seperti yang kita ketahui lebih lanjut pandangan harus menyesuaikan secara dinamis dan menjadi ruang yang sesuai.

Jika Anda mengatur ketinggian maksimal, Anda mungkin memaksakan pandangan untuk tidak mendapatkan ruang yang cukup atau mengambil ruang lebih sedikit. Saya tahu bahwa kadang-kadang tampaknya praktis untuk mengatur ketinggian maksimal. Tetapi jika resolusi akan pernah berubah secara dramatis, dan itu akan !, maka tampilan, yang memiliki ketinggian maksimal, akan terlihat tidak sesuai.

Saya pikir tidak ada cara yang tepat untuk melakukan tata letak yang Anda inginkan. saya akan merekomendasikan Anda untuk memikirkan tata letak Anda menggunakan manajer tata letak dan mekanisme relatif. saya tidak tahu apa yang ingin Anda capai tetapi kedengarannya agak aneh bagi saya bahwa daftar hanya menampilkan tiga item dan kemudian pengguna harus menggulir.

btw. minHeight tidak dijamin (dan mungkin juga seharusnya tidak ada). itu dapat memiliki beberapa manfaat untuk memaksa item agar terlihat sementara item relatif lainnya menjadi lebih kecil.

Diego Frehner
sumber
6
Ini salah. Dengan logika ini, Anda tidak akan bisa mengatakan android: layout_width = "500dp", baik.
Glenn Maynard
Saya tidak melihat apa yang salah dan interpretasi logika Anda. Jika Anda mengatur layout_width (yang terkadang ok), itu tidak dijamin Anda mendapatkannya. 500dp mungkin terlihat pada satu perangkat yang sesuai, yang lain tidak. Manajer tata letak! Mungkin Anda bisa menjelaskan lebih banyak bcs suara turun mengganggu :)
Diego Frehner
3
Sama validnya dengan mengatakan android: maxWidth = "500dp" dengan mengatakan android: layout_width = "500dp". Keduanya memaksa dimensi spesifik pada tampilan.
Glenn Maynard
1

Jika ada yang mempertimbangkan untuk menggunakan nilai tepat untuk LayoutParams misalnya

setLayoutParams(new LayoutParams(Y, X );

Jangan lupa untuk mempertimbangkan kepadatan tampilan perangkat jika tidak Anda mungkin mendapatkan perilaku yang sangat aneh pada perangkat yang berbeda. Misalnya:

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

Pertama, dapatkan tinggi item dalam piksel

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

maka sederhananya

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

jika kalian ingin membuat scrollview atau listview non-overflow, tetapi hanya pada RelativeLayout dengan topview dan bottomview di atas dan bawah untuk itu:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_above="@+id/topview"
    android:layout_below="@+id/bottomview" >
An Quoc Duy Nguyen
sumber
Ini membutuhkan lebih banyak kredit. Implementasi spesifik tetapi sederhana.
Luke Allison
0

Saya menggunakan ScrollView khusus yang dibuat di Kotlin yang menggunakan maxHeight. Contoh penggunaan:

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

Berikut adalah kode dari 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
}
}

yang juga membutuhkan deklarasi ini dalam values/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScrollViewWithMaxHeight">
        <attr name="android:maxHeight" />
    </declare-styleable>
</resources>
Mario Velasco
sumber