IT

Android: 뷰에 max Height가 없는 이유는 무엇입니까?

itgroup 2023. 10. 25. 23:16
반응형

Android: 뷰에 max Height가 없는 이유는 무엇입니까?

뷰에는 뭔가가 있지만 뭔가 부족합니다.maxHeight:

제가 이루고자 하는 것은 몇 가지 항목(뷰)을 채우는 것입니다.ScrollView일 때 1 명일 때.3 직접전시하고 싶은 아이템.제가 직접 전시하고 싶은 물건은 3가지입니다.을 합니다.ScrollView1, 2 또는 3 아이템의 높이를 갖습니다.

4개 이상의 물건이 있을때 나는 그것을 원합니다.ScrollView확장을 멈추다 (thus a)maxHeight스크롤을 시작합니다.

하지만 안타깝게도 다음을 설정할 방법이 없습니다.maxHeight. 그래서 아마 제가 해야 할 것 같습니다.ScrollView프로그래밍 방식으로 높이를 지정합니다.WRAP_CONTENT1명이 있을 때..3개의 아이템과 높이를 설정합니다.3*sizeOf(View)4개 이상일 때.

왜 그런 일이 없는지 설명해 줄 수 있는 사람?maxHeight에 제공됩니다.minHeight?

(BTW: 일부 보기들은, 예를 들어,ImageView을 가지다maxHeight실시.)

이 솔루션 중 어떤 것도 필요한 것에는 작동하지 않았습니다. 스크롤뷰는 랩 콘텐츠로 설정되었지만 최대 높이를 가지고 있어서 특정 지점 이후 확장을 멈추고 스크롤을 시작했습니다.ScrollView에서 onMeasure 메소드만 덮어썼습니다.

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

이것은 모든 상황에서 작동하지는 않지만, 제 레이아웃에 필요한 결과를 제공해 줍니다.그리고 그것은 또한 마두의 코멘트를 다루고 있습니다.

스크롤 뷰 아래에 일부 레이아웃이 있는 경우 이 트릭은 작동하지 않습니다 – madhu Mar 5 4:36

A를 만들기 위해서는ScrollView아니면ListViewmaxHeight를 사용하면 maxHeight를 원하는 높이로 주변에 투명 선형 배치를 만들기만 하면 됩니다.그런 다음 ScrollView(스크롤뷰)의 높이를wrap_content 선형 때까지 것처럼 가 생성됩니다 그러면 높이가 상위 선형 레이아웃과 같을 때까지 커지는 것처럼 보이는 스크롤 뷰가 만들어집니다.

이를 통해 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>

(이것이 질문에 직접 답하는 것은 아니지만 maxHeight 기능을 찾는 다른 사람들에게 도움이 될 수 있습니다.)

ConstraintLayout은 다음을 통해 자녀에게 최대 높이를 제공합니다.

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

아니면

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

샘플 용도는 여기에 있습니다.

가능하다면 휘즐의 답변에 대해 언급하고 싶지만 안드로이드 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화면의 전체 높이를 확장하지 않으며 안드로이드 N의 멀티 윈도우에서 가장 작은 과부 크기 내로 축소됩니다.

위에서 언급한 바와 같이 ConstraintLayout은 다음을 통해 어린이에게 최대 높이를 제공합니다.

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

또한 App을 실행할 때까지 ConstraintLayout 한 개의 자녀에 대한 최대 키가 불확실한 경우에도 이 자녀가 수직 체인의 어디에 배치되었든 자동으로 가변 키를 조정할 수 있는 방법이 있습니다.

예를 들어 가변 헤더 TextView, 가변 스크롤View 및 가변 바닥글 TextView가 있는 하단 대화상자를 표시해야 합니다.총 높이가 320dp에 도달하지 않았을 때 대화상자의 최대 높이는 320dp ,이며 ScrollView가 wrap_content로 작동하고, 총 높이가 ScrollView를 초과할 때 "maxHeight=320dp - header height - footer height"로 작동합니다.

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"

Horizontal maxWidth 사용량은 상당히 동일합니다.

max Height는 설정할 수 없습니다.하지만 높이는 설정할 수 있습니다.

그러려면 View를 스크롤하는 각 항목의 높이를 검색해야 합니다.그런 다음 스크롤 보기 높이를 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));

포장해주세요.ScrollView당신 평원 주위에LinearLayoutlayout_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>

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

여기에 답이 있습니다.

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);
    }

필요한 사람이 있을 경우:

app:layout_constraintHeight_max="300dp"

뷰(제약 조건 레이아웃 내부)를 최대 높이로 300dp로 강제 설정합니다.프로그래밍 방식으로 이 작업을 수행하려는 사람들은 다음과 같이 수행합니다.

val totalScreenHeight = displayMetrics.heightPixels
val layoutParams: ConstraintLayout.LayoutParams = viewThatIsInsideAConstraintLayout.layoutParams as ConstraintLayout.LayoutParams
        layoutParams.matchConstraintMaxHeight = totalScreenHeight/2
viewThatIsInsideAConstraintLayout.layoutParams = layoutParams

layout_weight 값을 사용해보셨습니까?하나를 0보다 큰 값으로 설정하면 해당 보기가 사용 가능한 남은 공간으로 확장됩니다.

확장해야 하는 여러 뷰가 있는 경우 값은 각 뷰 사이의 가중치가 됩니다.

따라서 두 개의 뷰를 모두 layout_weight 값 1로 설정한 경우, 둘 다 공간을 채우기 위해 늘어나지만 둘 다 동일한 공간으로 늘어나게 됩니다.둘 중 하나를 2 값으로 설정하면 다른 보기보다 두 배 더 늘어납니다.

여기에는 선형 레이아웃 아래에 나열된 몇 가지 정보가 있습니다.

한가지 아이템에 대해서만 런타임에 높이를 설정할 수 있을 것 같습니다.scrollView.setHeight(200px), 2개에 대하여scrollView.setheight(400px)3인 이상scrollView.setHeight(600px)

우리가 알고 있듯이 안드로이드를 실행하는 장치들은 화면 크기가 다를 수 있습니다.우리가 더 잘 알고 있듯이 뷰는 동적으로 조정되어야 하고 적절한 공간이 되어야 합니다.

최대 높이를 설정하면 보기에 충분한 공간을 확보하지 못하거나 더 적은 공간으로 이동할 수 있습니다.가끔은 최대 높이를 설정하는 것이 현실적인 것처럼 보이는 것으로 알고 있습니다.하지만 해상도가 극적으로 변한다면! 그러면 최대 높이를 가진 뷰는 적절치 않아 보입니다.

당신이 원하는 레이아웃을 정확하게 할 방법이 없다고 생각합니다.레이아웃 관리자와 상대적인 메커니즘을 사용하여 레이아웃에 대해 생각해 보는 것을 추천합니다.무엇을 달성하려고 하는지는 모르겠지만 목록에 세 가지 항목만 표시된 다음 사용자가 스크롤해야 한다는 것이 저에게는 조금 이상하게 들립니다.

그건 그렇고, min Height는 보장되지 않습니다 (그리고 아마도 존재하지 않아야 할 것입니다).다른 상대적인 항목이 작아지는 동안 항목이 보이도록 하는 이점이 있을 수 있습니다.

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

먼저 픽셀 단위로 항목 높이를 가져옵니다.

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

오버플로우가 아닌 스크롤 뷰 또는 목록 뷰를 만들고 싶지만 상단 뷰와 하단 뷰가 있는 상대적 레이아웃 상에 있는 경우:

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

나는 코틀린에서 만든 커스텀 스크롤뷰를 사용했습니다.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>

언급URL : https://stackoverflow.com/questions/4054567/android-why-is-there-no-maxheight-for-a-view

반응형