ConstraintLayout-Ketten und Text Auslassungszeichen + Bild auf der Rechten Seite
UPDATE JULI 2018:
Wenn Sie ConstraintLayout 1.1.0
, die richtige Eigenschaft zu verwenden ist app:layout_constrainedWidth="true"
an die Stelle der alten app:layout_constraintWidth_default="wrap"
(und die Höhe Gegenstück). Siehe aktualisierte Antwort.
UPDATE-NOVEMBER 2017:
Wenn Sie ConstraintLayout 1.0.0
stabil (oder höher) (1.0.2 zu dieser Zeit), siehe die aktualisierte Antwort für eine einfachere Lösung ohne die Notwendigkeit, nest-layouts.
Ursprünglichen Frage:
Mit ConstraintLayouts-Beta3
veröffentlicht am Nov 3rd 2016. (Quelle)
Ich versuche, Folgendes zu tun:
| |
|<-[TextView]<->[ImageView] -----------> |
| |
Die ich erreicht haben, mit einem layout, in etwa so:
<TextView
android:id="@+id/textView"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintRight_toLeftOf="@+id/caret"
app:layout_constraintHorizontal_bias="0.0"
android:text="Some Text"
android:textAlignment="viewStart"
android:gravity="start" />
<ImageView
android:id="@+id/caret"
android:layout_width="wrap_content"
android:layout_height="8dp"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintLeft_toRightOf="@+id/textView"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="@+id/textView"
app:layout_constraintBottom_toBottomOf="@+id/textView"
app:layout_constraintHorizontal_bias="0.0"
android:contentDescription=""
app:srcCompat="@drawable/ic_selection"
android:layout_marginStart="8dp"/>
Sieht dies gut aus, aber wenn der text länger ist als der verfügbare Platz...
| |
|<-[TextView Larger Than The Space Avail]|
| |
Die text-Ansicht hat einen Stil, der angibt, diese:
<item name="android:lines">1</item>
<item name="android:maxLines">1</item>
<item name="android:ellipsize">end</item>
Also es sollte Arbeit, aber ich bin mir nicht sicher, welchen Einschränkungen muss ich das Bild schieben, bis die Rechte und dann stop gibt und lassen Sie die text-Ansicht zu verstehen, es gibt keinen Platz mehr.
Was bin ich?
Hinweis: Wenn ich die textview die Breite der 0dp, funktioniert es, aber dann wird das Bild immer auf die richtige (horizontale Neigung zu sein scheint, ignoriert es)
Note2: ich habe versucht dies mit beta2 als gut, in der Tat, es scheint, wie der Beta3 hat eine Fehler in den visual editor.
UPDATE: ich habe versucht, zu replizieren diese in Xcode/AutoLayout:
Dies ist, wie es aussieht mit einem Kurzen Text
Nun das gleiche layout, ich tippe einfach einen langen text in der text-Ansicht...
Wie Sie sehen können, die Spur (rechts) Einschränkung für das Bild anzeigen sagt: du bist 8 oder mehr Punkte am rechten Rand.
Ist es auch fixiert an der linken Seite, um das Etikett (textView).
Aus, was ich nur aus Twitter gelernt, diese nicht möglich sein kann auf Android ConstraintLayout im moment: Quelle
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE JULI 2018:
Wenn Sie
ConstraintLayout 1.1.0
, die richtige Eigenschaft zu verwenden istapp:layout_constrainedWidth="true"
an die Stelle der altenapp:layout_constraintWidth_default="wrap"
(und die Höhe Gegenstück)UPDATE NOVEMBER 2017
Ich bin mit Hilfe von Constraint-Layouts 1.0.2 und ich habe eine weniger verschachtelte Lösung mit
app:layout_constraintWidth_default="wrap"
(eine Eigenschaft, die vorgestellt wurde in der 1.0.0 aber die Beta-dieser Beitrag wurde mit nicht haben).Statt der
FrameLayout
enthält eineLinearLayout
jetzt können Sie all das und haben es auf diese Weise:Diese effektiv genau das tut, was ich will, ohne hacks oder Richtlinien oder hardcoded Größen.
Die TextView wird die Größe zur Verfügung gestellt durch die Einschränkungen (die unter normalen Umständen würde bedeuten, es wäre entweder falsch oder wachsen über das 'parent'), aber Dank der neuen attribute, diese Einschränkungen zulässig sind verbogen/gebrochen werden, wenn der Inhalt kleiner/größer.
Ich muss sagen es funktioniert viel besser als iOS Prioritäten. (Zumindest ist es viel einfacher zu begreifen für mich). Daumen hoch für Google auf dieses 🙂
ALTE ANTWORT (falls du es noch brauchen).
Basierend auf Nicolas Roard ' s Antwort, ich werde erstellen Sie eine benutzerdefinierte container, der würde im Grunde berechnen Sie den verfügbaren Speicherplatz, und legen Sie programmgesteuert die maxWidth auf die TextView. Anstelle der Zugabe eine andere Klasse, unit-test, möglicher bugs, etc., zu dem Projekt habe ich versucht, eine etwas weniger effiziente Methode der Verschachtelung ein paar layouts, denn wir haben verschachteln von layouts seit dem Zeitalter der Dämmerung und das dies nicht auf jeder Liste Ansicht oder bewegen sich zu viel (oder überhaupt) und dass ich mit ConstraintLayouts zu glätten, die meisten der Hierarchie (wie nie zuvor!), dann denke ich nicht, dass ein wenig verschachteln , bis dies besser unterstützt ist das schlimm.
Also, was ich Tat, war im Grunde, verwenden Sie ein FrameLayout, das ist von design optimiert (oder gedacht) haben ein Kind (tho es kann mehr). Das FrameLayout ist, der hat die ConstraintLayout-Regeln angewendet, etwa so:
Also in meinem real app, das FrameLayout ist in einem anderen ConstraintLayout, das über ein Symbol Links und einige andere Sachen, aber aus Gründen der diesem Beispiel, stellen Sie sich vor Sie haben, um "pin" Links/rechts dieser FrameLayout, um was auch immer Raum, den Sie besetzen wollen. In diesem Beispiel können Sie sehen, ich bin mit
parent
bei allen Einschränkungen, aber es könnten auch andere widgets Links und rechts von der FrameLayout; Dank ConstraintLayout Magie, diese zu besetzen, dass alle verfügbaren Platz.Hier kommt nun der 2. Teil der trick... da ConstraintLayout garantiert, dass das FrameLayout wird mit "alle den Raum," wir haben nie mehr (oder weniger), kann ich jetzt mit einem LinearLayout innerhalb... wie so...
Aufmerksame Leser wird bemerken, dass das LinearLayout hat
wrap_content
in seiner Breite, das ist sehr wichtig für das Kind TextView kann, haben eine Breite von 0dp und einweight
1, was bedeutet, es wird alle freien Speicherplatz nach allen anderen widgets, die errechnet haben, dass Ihre Breite.In diesem speziellen Fall das andere Kind (Bildansicht)
caret
hat kein Gewicht angegeben ist und eine Feste Breite, also die TextView nicht haben, zu teilen/splitten Sie den freien Speicherplatz mit jemand anderes und er kann es nehmen (aber nur den freien Raum, denken Sie daran, seine Breite ist 0dp).Diese weniger effizient Ansatz effektiv erreicht genau das, was ich wollte, wenn auch mit weniger ConstraintLayout Magie wenn man so will.
Auf der plus-Seite, die ich nicht haben, um eine benutzerdefinierte Ansicht erstellen, durchführen, Mathematik und eine
requestLayout()
nach all meinen Mathe war getan; diese weniger effizienten Ansatz wird/sollte Maßstab und bis ConstraintLayout bietet eine gültige alternative, es kann sein, genug, wie es ist.Shoutout an die Google-Ingenieur(s), die geantwortet auf social media, und schließlich die Zeit genommen, um darüber nachzudenken. Vielleicht in der Zukunft, wenn Sie schreiben, Aufgaben und story-Punkte über ConstraintLayout 1.1, merken Sie das und kommen mit einer guten Lösung
app:layout_constraintWidth_default="wrap"
für Sie zu arbeiten. Nicht sicher, warum... Konnte es nicht zu funktionieren mit den neuerenapp:layout_constrainedWidth="true"
Tatsächlich, hier ist, wie Sie es tun TextViews -- verwenden
android:maxWidth
:Ist es nicht genau das, was Sie fragte (Sie müssen wissen, und stellen Sie die Größe-Grenze Breite), aber dass kann Ihnen helfen, bis wir Unterstützung in ConstraintLayout selbst.
Können Sie die relative layout in constraint-layout mit negativem margin für die Bildansicht. Bitte Aufmerksamkeit, um
android:layout_marginRight="26dp"
undandroid:layout_marginLeft="-26dp"
Wenn der text lang ist:
In meinem Fall-Update ab Juli 2018 von Martin nicht:
Habe ich
android:width="wrap_content"
für text-Ansicht mitapp:layout_constrainedWidth="true"
.android:layout_width="0dp"
(match_constraint) macht der text-Ansicht gestreckt für kürzere Zeichenfolgen in meinem Fall.Andere Möglichkeit, um dasselbe Ergebnis zu erzielen wäre, die Nutzung
android:layout_width="0dp"
mit Flaggeapp:layout_constraintWidth_max="wrap"
statt.Mehr über flags für constraint-layout finden Sie in doc:
https://developer.android.com/reference/android/support/constraint/ConstraintLayout
Diese Antwort ist inspiriert von Martin Marconcini Antwort (https://stackoverflow.com/a/40491128/1151701).
Um eine Verringerung der Hierarchie, können Sie ersetzen die Einschränkung layout mit einer einfachen Ansicht.
btw, ich bin mit ConstraintLayout
androidx.constraintlayout:constraintlayout:2.0.0-alpha3
aberapp:layout_constrainedWidth="true"
gearbeitet wird wie in diesem Fall erwartet. Also ich habeapp:layout_constraintWidth_default="wrap"
hier