Prozentsatz der maximalen Breite von ConstraintLayout

Lesezeit: 5 Minuten

Benutzeravatar von Hyhage
Hyhage

Ich habe mit ConstraintLayout experimentiert. Gibt es eine Möglichkeit, die maximale Breite einer Ansicht auf einen Prozentsatz der übergeordneten Ansicht festzulegen (und ein Höhen-Match-Einschränkungs- und Dimensionsverhältnis von 1:1)?

Hier ist der Code ohne Verwendung der maximalen Breite:

<?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"
  android:layout_width="match_parent"
  android:layout_height="wrap_content">

   <FrameLayout
      android:id="@+id/frameLayout3"
      android:layout_width="0dp"
      android:layout_height="259dp"
      android:layout_marginEnd="8dp"
      android:layout_marginStart="8dp"
      android:background="@android:color/black"
      app:layout_constraintEnd_toEndOf="parent"
      app:layout_constraintHorizontal_bias="0.0"
      app:layout_constraintStart_toEndOf="@+id/imageView"
      app:layout_constraintTop_toTopOf="parent"/>

   <ImageView
      android:id="@+id/imageView"
      android:layout_width="0dp"
      android:layout_height="0dp"
      android:src="https://stackoverflow.com/questions/49255147/@android:drawable/ic_menu_add"
      app:layout_constraintBottom_toBottomOf="@+id/frameLayout3"
      app:layout_constraintDimensionRatio="1:1"
      app:layout_constraintStart_toStartOf="parent"
      app:layout_constraintTop_toTopOf="parent"
      app:layout_constraintWidth_percent="0.3"/>

</android.support.constraint.ConstraintLayout>

Das ist das Ergebnis:

Tablette:

Tablette

Telefon:

Telefon

  • Versuchen Das Verknüpfung.

    – Cagri Yalcin

    13. März 2018 um 11:50 Uhr

  • Ich würde die Verwendung von PercentLayout jedoch lieber vermeiden, da es zugunsten von ConstraintLayout veraltet war.

    – Hyhage

    13. März 2018 um 12:19 Uhr

  • Dann können Sie verwenden LinearLayout

    – Cagri Yalcin

    13. März 2018 um 14:01 Uhr

  • Tut mir leid, wenn ich mich nicht ganz klar ausgedrückt habe, ich möchte eigentlich keine Prozentsätze für Breite/Höhe verwenden, ich möchte nur, dass die Ansicht durch einen Prozentsatz eingeschränkt wird. Wenn Sie einen Prozentsatz verwenden (anhand des Gewichts oder anhand einer Richtlinie), sieht es auf dem Telefon so aus: i.imgur.com/4fjmryf.png Das ist in Ordnung, aber nicht auf dem Tablet: i.imgur.com/27F39Lq.png . Die ImageView sollte nicht größer sein als das FrameLayout auf der rechten Seite.

    – Hyhage

    13. März 2018 um 14:45 Uhr


Benutzeravatar von Thomson Varghese
Thomson Varghese

Ich habe den maximalen Breitenprozentsatz mithilfe von zwei Attributen erreicht:

app:layout_constraintWidth_max="wrap"
app:layout_constraintWidth_percent="0.4" 

Beispiel:

<TextView
    android:id="@+id/textView2"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:text="Helo world"
    android:textAlignment="viewStart"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintWidth_max="wrap"
    app:layout_constraintWidth_percent="0.4" />

Die Textbreite wird auf 40 % der übergeordneten Textbreite erhöht und dann umbrochen, wenn der Inhalt diese Breite überschreitet.

  • @thomson-varghese, ich habe Ihre Antwort ausprobiert, aber ich habe kein korrektes Ergebnis erhalten. Vielleicht habe ich etwas falsch gemacht. Können Sie bitte meinen Code überprüfen und schreiben, wie man die maximale Breite als Prozentsatz des übergeordneten Elements festlegt, aber nur die „normale“ Breite sollte wie „wrap_content“ sein: 1) erste Variante wenn der Text zu lang ist und die Breite % vom übergeordneten Element sein sollte 2) zweite Variantewenn die Breite nicht so groß sein soll, jast wrap_content Mein Code

    – Sergej Grischin

    28. Juli 2019 um 15:42 Uhr

  • gut gemacht! Könnten Sie bitte erklären, was das bedeutet? layout_constraintWidth_max="wrap" eigentlich meinen?

    – Mamavart

    30. April 2020 um 11:42 Uhr

  • Funktioniert nicht, wenn eine solche Textansicht im vertikalen Fluss platziert wird und die Ansicht darüber und darunter verdeckt

    – Michał Ziobro

    15. Juni 2020 um 8:34

  • aber wenn der belegte Platz weniger als 0,4 Prozent beträgt, wird immer noch ein Mindestwert von 0,4 Prozent erreicht

    – Benutzer924

    21. Juli 2020 um 14:42 Uhr

  • Es wird kein Umbruch durchgeführt, wenn der Text aus mehreren Zeilen besteht

    – David Ibrahim

    19. Okt. 2020 um 7:08

Wenn ich Ihr Problem richtig verstehe, haben Sie es fast geschafft. Ich glaube, du gibst frameLayout Statische Höhe, deshalb liefert es auf dem Tablet nicht das richtige Ergebnis, weil Sie die Höhe entsprechend der Telefonvorschau eingestellt haben. Was Sie tun müssen, ist die Höhe festzulegen frameLayout relativ zu imageView.. also wann imageView wächst in der Größe frameLayout wächst auch mit.

Ich denke, Sie sollten so etwas tun

<?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"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:src="https://stackoverflow.com/questions/49255147/@android:drawable/ic_menu_add"
        app:layout_constraintDimensionRatio="1:1"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintWidth_percent="0.3" />    

    <FrameLayout
        android:id="@+id/frameLayoutTwo"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:background="@android:color/black"
        app:layout_constraintBottom_toBottomOf="@+id/imageView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/imageView"
        app:layout_constraintTop_toTopOf="parent" /> 

</android.support.constraint.ConstraintLayout>

Ich habe es überprüft und es ergibt das gleiche Ergebnis auf dem Telefon und dem Tablet. Korrigieren Sie mich, wenn ich Ihr Problem falsch verstanden habe.

Nein, da ist kein. Ich denke, wir sollten eine Funktionsanfrage stellen. Ich bin mir ziemlich sicher, dass PercentRelativeLayout diese Funktion ebenfalls nicht hat. (Diese Antwort gilt für ConstraintLayout 1.1)

Sie können eine festlegen LinearLayout oder andere ViewGroup als exakter Prozentsatz width und platzieren Sie Ihre wrap_content Blick in dieses Layout.

        <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <ImageView
                android:id="@+id/image_place_holder"
                android:layout_width="0dp"
                android:layout_height="0dp"
                android:scaleType="centerCrop"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

            <!-- This LinearLayout will have exact 80% of parent width-->
            <LinearLayout
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="parent"
                app:layout_constraintWidth_percent="0.8">

                
                <!-- This MaterialCardView will get a wrap_content width, 
                with a max width of his parent LinearLayout, which is 80% -->
                <com.google.android.material.card.MaterialCardView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/half_activity_horizontal_margin"
                    android:layout_marginTop="@dimen/half_activity_vertical_margin"
                    android:layout_marginEnd="@dimen/half_activity_horizontal_margin"
                    android:layout_marginBottom="@dimen/half_activity_vertical_margin"
                    android:backgroundTint="?attr/colorPrimary">

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:maxLines="1"
                        android:paddingStart="@dimen/half_activity_horizontal_margin"
                        android:paddingEnd="@dimen/half_activity_horizontal_margin"
                        android:text="Lorem ipsum"
                        android:textAppearance="?attr/textAppearanceCaption" />

                </com.google.android.material.card.MaterialCardView>

            </LinearLayout>

        </androidx.constraintlayout.widget.ConstraintLayout>

1452130cookie-checkProzentsatz der maximalen Breite von ConstraintLayout

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

Privacy policy