Android: ทำไมถึงไม่มี maxHeight สำหรับการดู?


184

มุมมองมีminHeightแต่อย่างใดขาดmaxHeight:

สิ่งที่ฉันพยายามที่จะบรรลุจะมีบางรายการ (มุมมอง) ScrollViewเติมขึ้น เมื่อมีรายการ 1..3 ฉันต้องการแสดงโดยตรง ความหมายScrollViewมีความสูงของทั้ง 1, 2 หรือ 3 รายการ

เมื่อมีรายการ 4 รายการขึ้นไปฉันต้องการScrollViewหยุดขยาย (ดังกmaxHeight) และเริ่มให้เลื่อน

maxHeightแต่มีวิธีการที่น่าเสียดายที่ชุดไม่มี ดังนั้นฉันอาจต้องตั้งค่าScrollViewความสูงของฉันโดยทางโปรแกรมWRAP_CONTENTเมื่อมี 1..3 รายการและตั้งค่าความสูงเป็น3*sizeOf(View)เมื่อมี 4 รายการขึ้นไป

ใครสามารถอธิบายได้ว่าทำไมไม่มีการmaxHeightให้เมื่อมีminHeight?

(BTW: มุมมองบางอย่างเช่นImageViewมีการmaxHeightใช้งาน)


ฉันโพสต์วิธีแก้ปัญหาในหัวข้ออื่น ๆ : stackoverflow.com/questions/18425758/…
JMPergar

2
ฉันได้สร้างวิธีแก้ปัญหาสำหรับสิ่งนี้ที่chintanrathod.com/…
Chintan Rathod

Google ลบ maxHeight น่ารำคาญและไม่สะดวก ดูทุกสิ่งที่คุณต้องทำตอนนี้เพื่อให้ได้ผลลัพธ์เดียวกัน
Ian Wambai

คำตอบ:


86

ไม่มีวิธีแก้ปัญหาใดที่ใช้งานได้สำหรับสิ่งที่ฉันต้องการซึ่งเป็นชุด ScrollView เป็น wrap_content แต่มี maxHeight ดังนั้นจึงหยุดขยายหลังจากจุดที่แน่นอนและเริ่มเลื่อน ฉันเพียงแค่เอาชนะวิธีการ onMeasure ใน ScrollView

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

สิ่งนี้อาจใช้งานไม่ได้ในทุกสถานการณ์ แต่มันให้ผลลัพธ์ที่จำเป็นสำหรับการจัดวางของฉันอย่างแน่นอน และยังแสดงความคิดเห็นโดย madhu

หากเลย์เอาต์บางอันอยู่ใต้ scrollview เคล็ดลับนี้จะใช้ไม่ได้ - madhu 5 มี.ค. เวลา 4:36


1
มันจะไม่ทำงานเมื่อไหร่? ดูเหมือนว่าวิธีการแก้ปัญหาที่สะอาดมาก ทำให้ฉันสงสัยว่าทำไมพวกเขาไม่ได้นำไปใช้กับ xml
Christophe Smet

1
มันอาจจะไม่ทำงานถ้าคุณตั้งความสูงด้วยตนเองเพื่อบอกว่า 240 ฉันไม่รำคาญที่จะตรวจสอบโหมดที่ scrollview อยู่เพราะฉันต้องการเพียงแค่รองรับโหมดเฉพาะ 1 โหมดเท่านั้น (wrap_content)
Whizzle

มีการแก้ไขสำหรับคำตอบนี้ที่ระบุว่า 'หากเลย์เอาต์บางอันอยู่ด้านล่างของ scrollview เคล็ดลับนี้จะไม่ทำงาน' ซึ่งไม่เป็นความจริง ฉันมีการจัดวางเลย์เอาต์ที่ด้านล่างของหน้าและเลย์เอาต์ที่กำหนดเองนี้มี "android: layout_above = '@ + ... '" ซึ่งจะวางเลย์เอาต์ที่กำหนดเองไว้เหนือเค้าโครงด้านล่างเสมอ :)
Machine Tribe

70

ในการสร้าง a ScrollViewหรือListViewด้วย maxHeight คุณเพียงแค่สร้าง LinearLayout แบบโปร่งใสรอบ ๆ ด้วยความสูงของสิ่งที่คุณต้องการให้ maxHeight เป็น แล้วคุณตั้งค่า ScrollView wrap_contentของความสูง สิ่งนี้จะสร้าง ScrollView ที่ดูเหมือนว่าจะโตขึ้นจนกว่าความสูงนั้นจะเท่ากับ LinearLayout หลัก


3
สิ่งนี้มีประโยชน์ในการป้องกันกล่องโต้ตอบที่มีการเลื่อนเนื้อหาไม่ให้ขยายจนเต็มความสูงของหน้าจอ
Kyle Ivey

ข้อเสนอแนะเล็กน้อยจะใช้ FrameLayout แทน LinearLayout แต่ฉันสงสัยว่ามันสำคัญ
Kyle Ivey

43
หากเลย์เอาต์บางอันอยู่ใต้ scrollview เคล็ดลับนี้จะใช้ไม่ได้
Sreedhu Madhu

2
คุณช่วยระบุรหัสได้ไหม มันใช้งานไม่ได้สำหรับฉันดังนั้นฉันอาจจะทำสิ่งผิดปกติ ...
นักพัฒนา Android

จะไม่ทำงานหากคุณมีปุ่มด้านล่าง มันจะผลักปุ่มออกจากหน้าจอ
หลี่เทียนกง

43

สิ่งนี้ได้ผลสำหรับฉันที่จะทำให้สามารถปรับแต่งได้ใน 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>

เค้าโครงตัวอย่าง

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

การสร้างมุมมองที่กำหนดเองเป็นวิธีที่ดีที่สุดในการบรรลุเป้าหมายนี้อย่างแน่นอน
Bertram Gilfoyle

และใช้งานได้หากคุณมีเค้าโครงด้านล่างเลื่อนดู! ที่สมบูรณ์แบบ!
Ragaisis

25

(ฉันรู้ว่านี่ไม่ได้ตอบคำถามโดยตรง แต่อาจเป็นประโยชน์กับผู้อื่นที่กำลังมองหาฟังก์ชั่น maxHeight)

ข้อ จำกัด เค้าโครงมีความสูงสูงสุดสำหรับเด็ก ๆ ผ่านทาง

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

หรือ

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

การใช้งานตัวอย่างที่นี่


2
วิธีนี้ใช้ไม่ได้หากมุมมองอยู่ในแนวตั้ง (ตามที่ระบุในเอกสาร ConstraintLayout)
Arno Schoonbee

ขอบคุณสำหรับข้อมูล.
user1506104

8

ฉันจะแสดงความคิดเห็นกับคำตอบของ whizzle ถ้าทำได้ แต่คิดว่ามันมีประโยชน์ที่จะต้องทราบว่าเพื่อให้ฉันแก้ปัญหานี้ในบริบทของโหมด multi-window ใน Android N ฉันต้องเปลี่ยนรหัสเล็กน้อยเป็น:

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

สิ่งนี้ช่วยให้เค้าโครงปรับขนาดให้เล็กกว่าความสูงสูงสุด แต่ยังป้องกันไม่ให้มีขนาดใหญ่กว่าความสูงสูงสุด ฉันใช้สิ่งนี้เป็นคลาสเลย์เอาต์ที่แทนที่RelativeLayoutและสิ่งนี้ทำให้ฉันสามารถสร้างกล่องโต้ตอบแบบกำหนดเองโดยScrollViewเป็นลูกของMaxHeightRelativeLayoutที่ไม่ขยายความสูงเต็มของหน้าจอและยังลดขนาดให้พอดีกับขนาดแม่ม่ายที่เล็กที่สุดในหลายหน้าต่างสำหรับ Android N.


4

ไม่มีวิธีตั้งค่า maxHeight แต่คุณสามารถตั้งค่าความสูงได้

ในการทำเช่นนั้นคุณจะต้องค้นพบความสูงของแต่ละรายการใน scrollView ของคุณ หลังจากนั้นเพียงตั้งค่าความสูง scrollView ของคุณเป็น numberOfItens * heightOfItem

ในการค้นหาความสูงของรายการให้ทำดังนี้

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

หากต้องการตั้งความสูงให้ทำดังนี้

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

ห่อของคุณScrollViewไปรอบ ๆ ธรรมดาของคุณLinearLayoutกับ layout_height = "max_height" นี้จะไม่ได้งานที่สมบูรณ์แบบ อันที่จริงฉันมีรหัสนี้ในการผลิตตั้งแต่ 5 ปีที่แล้วโดยไม่มีปัญหา

<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
โซลูชั่นที่สมบูรณ์แบบแน่นอน ฉลาดและเรียบง่าย มันเหมาะสำหรับ recyclerview
Alex Belets

3

MaxHeightScrollViewมุมมองที่กำหนดเองของฉัน

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>

การใช้

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

    ...

</....MaxHeightScrollView>

2

ฉันมีคำตอบที่นี่:

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

เพียงแค่สร้างคลาสใหม่ที่ขยาย ScrollView และแทนที่onMeasureเมธอดของมัน

    @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

ตามที่ระบุไว้ข้างต้น ConstraintLayout เสนอความสูงสูงสุดสำหรับเด็กผ่าน:

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

นอกจากนี้หากความสูงสูงสุดสำหรับลูกของ ConstraintLayout มีความไม่แน่นอนจนกว่าแอพจะทำงานอยู่ก็ยังมีวิธีที่จะทำให้เด็กคนนี้ปรับความสูงที่ไม่แน่นอนได้โดยอัตโนมัติไม่ว่าจะวางไว้ที่ใดในห่วงโซ่แนวตั้ง

ตัวอย่างเช่นเราต้องแสดงข้อความโต้ตอบด้านล่างด้วยส่วนหัวที่ไม่แน่นอนของ TextView, ScrollView ที่ไม่แน่นอนและส่วนท้ายของ TextView ที่ไม่แน่นอน ความสูงสูงสุดของไดอะล็อกคือ 320dp, เมื่อความสูงรวมไม่ถึง 320dp ScrollView ทำหน้าที่เป็น wrap_content เมื่อความสูงรวมเกิน ScrollView ทำหน้าที่เป็น "maxHeight = 320dp - ความสูงส่วนหัว - ความสูงท้ายกระดาษ"

เราสามารถทำได้โดยผ่านไฟล์เลย์เอาท์ 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>

รหัสการนำเข้าส่วนใหญ่สั้น:

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

app:layout_constrainedHeight="true"

การใช้งาน maxWidth แนวนอนค่อนข้างเหมือนกัน


1

คุณได้ลองใช้ค่า layout_weight แล้วหรือยังหรือยัง? หากคุณตั้งค่าเป็นค่าที่มากกว่า 0 มันจะขยายมุมมองนั้นไปยังพื้นที่ที่เหลืออยู่

หากคุณมีหลายมุมมองที่ต้องยืดออกค่าจะกลายเป็นน้ำหนักระหว่างมุมมองเหล่านั้น

ดังนั้นหากคุณมีสองมุมมองทั้งสองตั้งค่าเป็น layout_weight เป็น 1 แล้วพวกเขาทั้งสองจะยืดเพื่อเติมเต็มช่องว่าง หากคุณตั้งค่าหนึ่งในนั้นเป็นค่า 2 แล้วมันจะยืดสองเท่าของมุมมองอื่น

ข้อมูลเพิ่มเติมบางอย่างที่นี่แสดงไว้ภายใต้ Linear Layout


1
ปัญหาเกี่ยวกับน้ำหนักก็คือพวกมันสัมพันธ์กัน ขนาดหน้าจอที่แตกต่างกันผลลัพธ์ที่แตกต่างกันเช่นหน้าจอ 800px ฉันสามารถตั้งค่าน้ำหนักให้เป็นค่าที่แน่นอนเพื่อให้พื้นที่เฉพาะลงท้ายด้วย 200px ที่ต้องการ อย่างไรก็ตามด้วยหน้าจอ 850px พื้นที่เฉพาะจะมีขนาดใหญ่กว่า 200px แต่องค์ประกอบที่ล้อมรอบยังคงเป็นเพียง 200px นั่นเป็นเหตุผลที่ฉันต้องการmaxHeightตั้งค่าที่ฉันสามารถตั้งค่าการจุ่มเฉพาะ (ในที่สุดฉันก็ลงเอยด้วยการคำนวณและตั้งค่าความสูงโดยทางโปรแกรม)
znq

1

ฉันคิดว่าคุณสามารถตั้งค่า heiht ที่รันไทม์สำหรับ 1 รายการเพียงแค่scrollView.setHeight(200px)สำหรับ 2 รายการscrollView.setheight(400px)สำหรับ 3 หรือมากกว่าscrollView.setHeight(600px)


8
คุณไม่ต้องการตั้งค่ามิติข้อมูลเป็น 'px' เป็นไปได้อย่างมากว่าคุณจะไม่ได้รับผลลัพธ์ตามที่คุณต้องการบนอุปกรณ์หลายเครื่อง developer.android.com/guide/topics/resources/…
Hernd DerBeld

@ เฮิร์นเดอร์เบลด์นั่นเป็นวิธีการทำงานในโค้ด หากคุณต้องการคุณสามารถแปลงจาก DP เป็นพิกเซลได้อย่างง่ายดาย: float pixels = TypedValue.applyDimension (TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources () .getDisplayMetrics ();
นักพัฒนา android

1

ดังที่เราทราบว่าอุปกรณ์ที่ใช้ Android สามารถมีขนาดหน้าจอที่แตกต่างกันได้ ในขณะที่เรารู้เพิ่มเติมว่ามุมมองควรปรับแบบไดนามิกและกลายเป็นพื้นที่ที่เหมาะสม

หากคุณตั้งค่าความสูงสูงสุดคุณอาจบังคับให้มุมมองไม่ให้มีที่ว่างเพียงพอหรือใช้พื้นที่น้อยลง ฉันรู้ว่าบางครั้งดูเหมือนว่าจะตั้งค่าความสูงสูงสุด แต่ถ้าความละเอียดจะเปลี่ยนไปอย่างมากและมันก็จะ! มุมมองซึ่งมีความสูงสูงสุดจะดูไม่เหมาะสม

ฉันคิดว่าไม่มีวิธีที่เหมาะสมในการทำเค้าโครงที่คุณต้องการ ฉันอยากจะแนะนำให้คุณนึกถึงเลย์เอาต์ของคุณโดยใช้ตัวจัดการเลย์เอาต์และกลไกที่เกี่ยวข้อง ฉันไม่รู้ว่าคุณกำลังพยายามทำอะไร แต่มันแปลกสำหรับฉันที่รายการควรแสดงสามรายการเท่านั้นจากนั้นผู้ใช้ต้องเลื่อน

BTW ไม่รับประกันว่า minHeight (และอาจไม่มีอยู่ก็ได้) มันอาจมีประโยชน์บางอย่างในการบังคับให้ไอเท็มปรากฏในขณะที่ไอเท็มอื่น ๆ มีขนาดเล็กลง


6
นี่เป็นสิ่งที่ผิด ด้วยตรรกะนี้คุณจะไม่สามารถพูด android: layout_width = "500dp" ได้เช่นกัน
Glenn Maynard

ฉันไม่เห็นสิ่งที่ควรจะผิดทั้งการตีความตรรกะของคุณ หากคุณตั้งค่า layout_width (ซึ่งบางครั้งก็ใช้ได้) ก็ไม่รับประกันว่าคุณจะได้รับสิ่งนั้น 500dp อาจดูอุปกรณ์หนึ่งที่เหมาะสม ผู้จัดการเค้าโครง ftw! บางทีคุณอาจจะอธิบาย BCS มากขึ้นรบกวนลงคะแนนเสียง :)
ดิเอโก Frehner

3
เป็นเพียงที่ถูกต้องที่จะบอกว่า Android: maxWidth = "500dp" เหมือนกับที่จะบอกว่า Android: layout_width = "500dp" พวกเขาทั้งสองบังคับให้มีมิติเฉพาะในมุมมอง
Glenn Maynard

1

หากใครกำลังพิจารณาการใช้ค่าที่แน่นอนสำหรับ LayoutParams เช่น

setLayoutParams(new LayoutParams(Y, X );

อย่าลืมคำนึงถึงความหนาแน่นของอุปกรณ์ที่แสดงมิฉะนั้นคุณอาจมีพฤติกรรมแปลก ๆ บนอุปกรณ์ต่าง ๆ เช่น:

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

0

ขั้นแรกให้รับความสูงของรายการเป็นพิกเซล

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

จากนั้นก็ง่าย

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

0

หากคุณต้องการสร้าง scrollview หรือ listview ที่ไม่ใช่ล้นเพียง แต่อยู่ใน RelativeLayout ที่มี topview และ bottomview อยู่ด้านบนและด้านล่าง:

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

สิ่งนี้ต้องการเครดิตมากกว่า การใช้งานที่เฉพาะเจาะจง แต่ง่าย
ลุคอัลลิสัน

0

ผมใช้กำหนดเอง ScrollViewทำใน Kotlin maxHeightซึ่งการใช้งาน ตัวอย่างการใช้งาน:

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

นี่คือรหัสของ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
}
}

ซึ่งต้องการประกาศนี้ในvalues/attrs.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ScrollViewWithMaxHeight">
        <attr name="android:maxHeight" />
    </declare-styleable>
</resources>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.