Android: Warum gibt es keine maxHeight für eine Ansicht?

Lesezeit: 8 Minuten

Android Warum gibt es keine maxHeight fur eine Ansicht
znq

Ansicht haben eine minHeight aber irgendwie fehlt a maxHeight:

Was ich erreichen möchte, ist, dass einige Elemente (Ansichten) a füllen ScrollView. Wenn es 1..3 Elemente gibt, möchte ich sie direkt anzeigen. Bedeutung der ScrollView hat die Höhe von entweder 1, 2 oder 3 Elementen.

Bei 4 oder mehr Artikeln möchte ich die ScrollView aufhören zu expandieren (also a maxHeight) und beginnen Sie mit dem Scrollen.

Allerdings gibt es leider keine Möglichkeit, a einzustellen maxHeight. Also muss ich wohl meine einstellen ScrollView Höhe programmgesteuert entweder WRAP_CONTENT wenn es 1..3 Elemente gibt und stellen Sie die Höhe auf ein 3*sizeOf(View) wenn es 4 oder mehr Artikel gibt.

Kann jemand erklären, warum es keine gibt maxHeight vorausgesetzt, wenn es bereits eine gibt minHeight?

(Übrigens: einige Ansichten, wie ImageView haben eine maxHeight umgesetzt.)

  • Ich habe eine Lösung in einem anderen Thread gepostet: stackoverflow.com/questions/18425758/…

    – JMPergar

    5. November 14 um 13:45 Uhr

  • Ich habe eine Lösung dafür unter erstellt chintanrathod.com/…

    – Chintan Rathod

    28. April 15 um 6:20 Uhr

  • Das Entfernen von maxHeight durch Google ist ärgerlich und unbequem. Schauen Sie sich all die Dinge an, die Sie jetzt tun müssen, um das gleiche Ergebnis zu erzielen.

    – Ian Wambai

    28. Februar 17 um 13:46 Uhr

Keine dieser Lösungen funktionierte für das, was ich brauchte, nämlich eine ScrollView, die auf wrap_content gesetzt war, aber eine maxHeight hatte, sodass sie nach einem bestimmten Punkt nicht mehr erweitert wurde und mit dem Scrollen begann. Ich habe einfach die onMeasure-Methode in ScrollView überschrieben.

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

Dies funktioniert möglicherweise nicht in allen Situationen, aber es liefert mir auf jeden Fall die für mein Layout erforderlichen Ergebnisse. Und es geht auch auf den Kommentar von madhu ein.

Wenn ein Layout unter der Bildlaufansicht vorhanden ist, funktioniert dieser Trick nicht – madhu 5. März um 4:36 Uhr

  • Wann würde das nicht funktionieren? Dies scheint eine sehr saubere Lösung zu sein. Ich frage mich, warum sie es nicht in XML implementiert haben.

    – Christoph Smet

    2. Juni 14 um 6:03 Uhr

  • Es würde wahrscheinlich nicht funktionieren, wenn Sie die Höhe manuell auf 240 einstellen. Ich habe mir nicht die Mühe gemacht, den Modus zu überprüfen, in dem sich die Bildlaufansicht befindet, da ich nur einen bestimmten Modus (wrap_content) unterstützen musste.

    – pfeifen

    2. Juni 14 um 23:44 Uhr


  • Es gibt eine Bearbeitung für diese Antwort, die besagt: “Wenn ein Layout unter der Bildlaufansicht vorhanden ist, funktioniert dieser Trick nicht”, was nicht stimmt. Ich habe ein Layout, das am unteren Rand der Seite ausgerichtet ist, und dieses benutzerdefinierte Layout hat “android:layout_above=’@+…'”, wodurch das benutzerdefinierte Layout immer über dem unteren Layout platziert wird 🙂

    – Maschinenstamm

    31. Januar 19 um 14:02 Uhr

Um eine zu erstellen ScrollView oder ListView Mit einer maxHeight müssen Sie nur ein transparentes LinearLayout um ihn herum mit einer Höhe erstellen, die der maxHeight entsprechen soll. Dann setzen Sie die Höhe der ScrollView auf wrap_content. Dadurch wird ein ScrollView erstellt, das zu wachsen scheint, bis seine Höhe gleich dem übergeordneten LinearLayout ist.

  • Dies war nützlich, um zu verhindern, dass sich ein Dialog mit scrollenden Inhalten auf die volle Höhe des Bildschirms ausdehnt.

    – Kyle Ivey

    5. Dezember 13 um 0:36 Uhr

  • Ein kleiner Vorschlag wäre, ein FrameLayout anstelle eines LinearLayout zu verwenden, aber ich bezweifle, dass es darauf ankommt.

    – Kyle Ivey

    5. Dezember 13 um 0:37 Uhr

  • Wenn unterhalb der Bildlaufansicht ein Layout vorhanden ist, funktioniert dieser Trick nicht

    – Shreedhu Madhu

    5. März 14 um 4:36 Uhr

  • kannst du bitte einen Code angeben? bei mir hat es nicht geklappt, vielleicht mache ich was falsch…

    – Android-Entwickler

    10. April 14 um 08:58 Uhr

  • funktioniert nicht, wenn Sie Schaltflächen darunter haben. Es wird die Tasten vom Bildschirm drücken

    – Li Tian Gong

    4. Januar 15 um 23:32 Uhr

Dies hat für mich funktioniert, um es in XML anpassbar zu machen:

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>

Beispiellayout

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

  • Das Erstellen einer benutzerdefinierten Ansicht ist definitiv der beste Weg, dies zu erreichen.

    – Bertram Gilfoyle

    10. Januar 18 um 4:59 Uhr

  • Und das funktioniert, wenn Sie ein Layout unter der Bildlaufansicht haben! Perfekt!

    – Ragaise

    24. November 18 um 12:43 Uhr

Android Warum gibt es keine maxHeight fur eine Ansicht
Benutzer1506104

(Ich weiß, dass dies die Frage nicht direkt beantwortet, aber für andere hilfreich sein könnte, die nach der maxHeight-Funktionalität suchen.)

ConstraintLayout bietet maximale Höhe für seine Kinder via

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

oder

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

Beispielanwendung hier.

Ich hätte die Antwort von Whizzle kommentiert, wenn ich könnte, hielt es aber für nützlich zu bemerken, dass ich den Code leicht ändern musste, um dieses Problem im Zusammenhang mit dem Mehrfenstermodus in Android N zu lösen:

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

Dadurch kann die Größe des Layouts kleiner als die maximale Höhe geändert werden, aber auch verhindert werden, dass es größer als die maximale Höhe wird. Ich habe dies verwendet, ist eine Layoutklasse, die überschreibt RelativeLayout und dies erlaubte mir, einen benutzerdefinierten Dialog mit a zu erstellen ScrollView als Kind von MaxHeightRelativeLayout das nicht die volle Höhe des Bildschirms erweitert und auch schrumpft, um in die kleinste Fenstergröße in Multi-Window für Android N zu passen.

1642878786 211 Android Warum gibt es keine maxHeight fur eine Ansicht
xionghg

Wie oben erwähnt, bietet ConstraintLayout seinen Kindern maximale Höhe über:

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

Außerdem, wenn die maximale Höhe für ein ConstraintLayout-Kind ungewiss ist, bis die App ausgeführt wird, gibt es immer noch eine Möglichkeit, dieses Kind automatisch an eine veränderliche Höhe anzupassen, unabhängig davon, wo es in der vertikalen Kette platziert wurde.

Zum Beispiel müssen wir einen unteren Dialog mit einer änderbaren Kopfzeilen-TextView, einer änderbaren ScrollView und einer änderbaren Fußzeilen-TextView anzeigen. Die maximale Höhe des Dialogfelds beträgt 320 dp. Wenn die Gesamthöhe 320 dp nicht erreicht, fungiert ScrollView als wrap_content, wenn die Gesamthöhe ScrollView überschreitet, agiert es als „maxHeight=320 dp – Kopfzeilenhöhe – Fußzeilenhöhe“.

Wir können dies nur durch eine XML-Layoutdatei erreichen:

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

Der meiste Importcode ist kurz:

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

app:layout_constrainedHeight="true"

Die horizontale Verwendung von maxWidth ist ziemlich gleich.

1642878786 269 Android Warum gibt es keine maxHeight fur eine Ansicht
Derzu

Es gibt keine Möglichkeit, maxHeight festzulegen. Aber Sie können die Höhe einstellen.

Dazu müssen Sie die Höhe jedes Elements Ihrer scrollView ermitteln. Danach setzen Sie einfach Ihre ScrollView-Höhe auf numberOfItens * heightOfItem.

Um die Höhe eines Artikels zu ermitteln, gehen Sie wie folgt vor:

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

So stellen Sie die Höhe ein:

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

.

593860cookie-checkAndroid: Warum gibt es keine maxHeight für eine Ansicht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy