Wie center-mehrere Ansichten zusammen mit ConstraintLayout?
Hintergrund
Google hat angekündigt, ein neues layout namens "ConstraintLayout", die angeblich die ultimative layout, das konnte Sie auf alle ersetzen des layouts während des Aufenthaltes flat (ohne verschachtelte layouts) und haben eine bessere Leistung.
Das problem
Sache ist, ich kaum sehen, alle tutorials für die es, die mir helfen könnte in dieser Angelegenheit, anders als die video vorgestellt auf der Google IO.
Was ich versuche zu tun ist, da ich ein vertikal-zentriert LinearLayout in einem anderen layout - konvertieren Sie beide in einem einzigen ConstraintLayout.
Nachdem alle, dies ist der Zweck dieser neuen layout...
Layout möchte ich mit umgehen sieht wie folgt aus:
Beachten Sie, dass die Ansichten in der Mitte sind nur vertikal zentriert, und dass die 2 textViews sind auf der rechten Seite der Bildansicht, die auch vertikal zentriert.
Das ganze funktioniert auch mit RelativeLayout, die das LinearLayout des 2 TextViews, aber ich wünschte zu wissen, wie zu konvertieren Sie Sie in einem einzigen ConstraintLayout.
Hier ist eine Beispiel-XML von dem, was ich gezeigt habe:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
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="wrap_content"
android:minHeight="?attr/listPreferredItemHeightSmall">
<ImageView
android:id="@+id/appIconImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginEnd="4dp"
android:layout_marginLeft="2dp"
android:layout_marginRight="4dp"
android:layout_marginStart="2dp"
android:adjustViewBounds="true"
android:src="@android:drawable/sym_def_app_icon"
tools:ignore="ContentDescription"/>
<LinearLayout
android:id="@+id/appDetailsContainer"
android:layout_width="0px"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toEndOf="@+id/appIconImageView"
android:layout_toLeftOf="@+id/overflowView"
android:layout_toRightOf="@+id/appIconImageView"
android:layout_toStartOf="@+id/overflowView"
android:orientation="vertical">
<TextView
android:id="@+id/appLabelTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:text="label"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textDirection="locale"
tools:ignore="HardcodedText,UnusedAttribute"/>
<TextView
android:id="@+id/appDescriptionTextView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:minLines="3"
android:text="description"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textDirection="locale"
tools:ignore="HardcodedText,UnusedAttribute"/>
</LinearLayout>
<ImageView
android:id="@+id/overflowView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:adjustViewBounds="true"
android:background="?attr/selectableItemBackground"
android:clickable="true"
android:padding="10dp"
app:srcCompat="@drawable/ic_more_vert_black_24dp"
tools:src="@drawable/ic_more_vert_black_24dp"
tools:ignore="ContentDescription"/>
<ImageView
android:id="@+id/isSystemAppImageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/overflowView"
android:layout_alignLeft="@+id/overflowView"
android:layout_alignParentBottom="true"
android:layout_alignRight="@+id/overflowView"
android:layout_alignStart="@+id/overflowView"
android:adjustViewBounds="true"
android:scaleType="centerInside"
app:srcCompat="@drawable/ic_warning_black_24dp"
tools:ignore="ContentDescription"
tools:src="@drawable/ic_warning_black_24dp"/>
</RelativeLayout>
, Was ich versucht habe
Habe ich versucht zu Lesen, einige Artikel und sehen Sie sich einige videos von Google :
- https://codelabs.developers.google.com/codelabs/constraint-layout/index.html#0
- https://www.youtube.com/watch?v=sO9aX87hq9c
- https://youtu.be/csaXml4xtN8?t=1693
Das hat nicht geholfen, also habe ich versucht, es zu benutzen, in der Hoffnung ich werde es herausfinden, wie um ihn selbst zu benutzen.
Aber ich kann nicht herausfinden, wie es zu tun. Ich habe versucht mit der Funktion zum konvertieren von layouts, aber dieses macht ein großes Durcheinander der Ansichten und stellt zusätzliche Margen, die ich nicht haben möchte.
Die Frage
Wie kann ich umwandeln der 2-layouts in einem einzigen ConstraintLayout ?
- diese hier: "Arbeitsbereich".co/1hmJDCgg.png?
- Ein bisschen, aber der zentrierte Ansichten haben 2 TextViews, eine unter der anderen. Nicht ein. Derzeit befinden Sie sich innerhalb eines LinearLayout, die zentriert ist. Auch das LinearLayout ist zwischen den rechten und linken Ansichten.
- haben Sie versucht, die automatische Konvertierung im design-Bereich? "Convert <your_layout> zu ConstraintLayout"?
- Ja. und das Ergebnis hat nicht glätten Sie es überhaupt. Sie können sehen, meine versuche hier: code.google.com/p/android/issues/detail?id=212116
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf meine Antwort hier.
ContraintLayout
enthält eine feature -Chains
-, der es möglich macht, umzusetzen, was Sie fordern:Als für Ihren Fall, müssen Sie packen Sie Ihre
label
unddescription
TextViews und zentrieren Sie Sie in übergeordneten vertikal:(stellen Sie sicher, Sie verwenden eine version von
ConstraintLayout
unterstützt Ketten)Update 25-06-2019 (@Saeid Z):
Nun in constraint-layout 1.1.3 wir müssen
app:layout_constraintHorizontal_chainStyle="packed"
stattapp:layout_constraintVertical_chainPacked="true"
Zur Mitte etwas vertikal oder horizontal, legen Sie eine entgegenstehende Einschränkung auf das layout.
Vertikal Zentriert
Horizontal Zentriert
Set
app:layout_constraintVertical_bias="0.5"
den Ansichten werden müssen vertikal zentriert, bias-Attribut funktioniert nur, wenn Sie angeben, die Einschränkungen für die Grenzen (z.B. top-und bottom für die vertikale Vorspannung, Links und rechts für die horizontale Neigung)Beispiel:
Habe es in mein layout hier: https://github.com/hidroh/tldroid/blob/master/app/src/main/res/layout/activity_main.xml, ziemlich ähnliches layout, obwohl ich position Dinge auf 1/3 der Bildschirmhöhe.
EDIT: Diese Antwort geschrieben hatte, bevor Ketten zur Verfügung standen. Bitte verwenden Sie Ketten jetzt, siehe oben Antwort: https://stackoverflow.com/a/40102296/1402641
Ich jetzt glauben, dass Ihre einzige Wahl wäre, um wickeln Sie die zwei text-Ansichten in einem anderen layout - wahrscheinlich linear layout am besten passt dieser situation.
Aber das team hinter constraint-layout, sagte Sie einführen wollen "virtuellen Container", welche dazu dienen, genau diesen use-case: gruppieren Sie zwei oder mehr Ansichten zusammen und legen Sie eine Einschränkung (wie Zentrierung vertikal) auf dem Behälter. Die Idee ist, dass es sich nicht um eine vollständige geschachtelte layout innerhalb der constraint-layout, sondern einfach etwas, dass constraint-layout verwendet, um die position der Kinder - daher ist es eine bessere Leistung als Verschachtelung.
Erwähnen Sie es in Ihre I/O-talk (verbunden mit der genauen Zeit). Also ich denke, bleiben Sie dran.
alpha2
. Virtuelle Gruppen kommen mit Ihren Szenario.ConstraintLayout
einführen wollen. Sie beschlossen release Anfang, ohne alle features und ohne die Bearbeitung der Häufig auftretenden Fällen.Werfen Sie einen Blick in meinem Beispiel (Center-Komponenten in ConstraintLayout)
Jetzt könnte man center "Bild" (einschränken Links-oben-unten), beschränken "label" oben auf "Bild" oben, einschränken "Beschreibung" top "label" unten.
Im Beispiel unten habe ich angepasst haben, die Höhe der Buttons mit zwei textviews auf der rechten Seite (das ist dein Fall). Anderen textviews sind begrenzt wie auf den obigen link.
UPDATE: die Antwort auf Ihren Kommentar unter:
Habe ich installiert Ihr die app und diese ist nur ich kann denken derzeit. Da es ein ViewHolder layout, layout_height kann eingestellt werden, um wrap_content, oder Sie können es zu beheben, wenn Sie möchten. Ich kann Ihnen xml, wenn Sie wollen, ich will nicht mit der Flut die Antwort.
Top TextView Links-Einschränkung beschränkt sich auf die Rechte-Einschränkung der Bildansicht. Auch, top TextView -> top-Einschränkung gezwungen, an der Oberseite des Behälters, so ist Recht. Unten TextView ist begrenzt bis zum unteren Ende des Behälters. TextViews in der Mitte sind gezwungen, an Breite anpassen " top-TextView und bekam keine Verbindung mit Bildansicht.