Android: 뷰에 max Height가 없는 이유는 무엇입니까?
뷰에는 뭔가가 있지만 뭔가 부족합니다.maxHeight
:
제가 이루고자 하는 것은 몇 가지 항목(뷰)을 채우는 것입니다.ScrollView
일 때 1 명일 때.3 직접전시하고 싶은 아이템.제가 직접 전시하고 싶은 물건은 3가지입니다.을 합니다.ScrollView
1, 2 또는 3 아이템의 높이를 갖습니다.
4개 이상의 물건이 있을때 나는 그것을 원합니다.ScrollView
확장을 멈추다 (thus a)maxHeight
스크롤을 시작합니다.
하지만 안타깝게도 다음을 설정할 방법이 없습니다.maxHeight
. 그래서 아마 제가 해야 할 것 같습니다.ScrollView
프로그래밍 방식으로 높이를 지정합니다.WRAP_CONTENT
1명이 있을 때..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
아니면ListView
maxHeight를 사용하면 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
당신 평원 주위에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>
나의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
'IT' 카테고리의 다른 글
connect/expressjs에서 "서명된" 쿠키란 무엇입니까? (0) | 2023.10.25 |
---|---|
ASP의 다른 페이지로 리디렉션합니다.자바스크립트/jQuery를 이용한 NET MVC (0) | 2023.10.25 |
Swift에서 type def를 선언하려면 어떻게 해야 합니까? (0) | 2023.10.25 |
엔티티 프레임워크에서 네임스페이스 변경 (0) | 2023.10.25 |
"SELECT FROM" 쿼리를 Node.js의 Mariadb에 보냅니다. (0) | 2023.10.25 |