Ich versuche eine einfache Chat-Blase mit a zu implementieren ConstraintLayout
. Das versuche ich zu erreichen:
Allerdings wrap_content
scheint nicht richtig mit Einschränkungen zu arbeiten. Es berücksichtigt die Ränder, berechnet jedoch den verfügbaren Speicherplatz nicht richtig. Hier ist mein Layout:
<?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="wrap_content">
<TextView
android:id="@+id/chat_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintHorizontal_bias="0"
tools:background="@drawable/chat_message_bubble"
tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum."
android:layout_marginStart="64dp"
android:layout_marginLeft="64dp"
android:layout_marginEnd="32dp"
android:layout_marginRight="32dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp" />
</android.support.constraint.ConstraintLayout>
Dies ergibt Folgendes:
Ich benutze com.android.support.constraint:constraint-layout:1.0.0-beta4
.
Mache ich etwas falsch? Ist es ein Fehler oder nur ein unintuitives Verhalten? Kann ich mit a das richtige Verhalten erreichen ConstraintLayout
(ich weiß, dass ich andere Layouts verwenden kann, nach denen ich ConstrainLayout
speziell frage).
android
android-layout
android-constraintlayout
Marcin Jedynak
quelle
quelle
tools:background="@drawable/chat_message_bubble"
. Um es zu implementieren, müssen Sie die Datei chat_message_bubble.xml in einem zeichnbaren Ordner erstellen und dann den folgenden Code hinzufügen:<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Antworten:
Veraltet: Bessere Antwort sehen
Nein, Sie können mit ConstraintLayout nicht das tun, was Sie heute wollen (1.0 Beta 4):
wrap_content
fordert das Widget nur auf, sich selbst zu messen, beschränkt seine Erweiterung jedoch nicht auf eventuelle Einschränkungenmatch_constraints
(0DP) wird die Größe des Widgets gegen die Zwänge begrenzen ... aber wird sie auch passen , wennwrap_content
wäre geringer gewesen (Ihr erstes Beispiel), das ist nicht das, was Sie wollen entweder.Im Moment haben Sie also kein Glück für diesen speziellen Fall: - /
Jetzt ... denken wir darüber nach, zusätzliche Funktionen hinzuzufügen
match_constraints
, um genau dieses Szenario zu bewältigen (so, alswrap_content
ob die Größe nicht mehr als die Einschränkungen ist).Ich kann nicht versprechen, dass diese neue Funktion es vor der Version 1.0 schaffen wird.
Bearbeiten : Wir haben diese Funktion in 1.0 mit dem Attribut
app:layout_constraintWidth_default="wrap"
hinzugefügt (mit einer Breite von 0dp). Wenn festgelegt, hat das Widget die gleiche Größe wie bei Verwendung von wrap_content, wird jedoch durch Einschränkungen eingeschränkt (dh es wird nicht darüber hinaus erweitert).Update Jetzt sind diese Tags veraltet. Verwenden Sie stattdessen layout_width = "WRAP_CONTENT" und layout_constrainedWidth = "true".
quelle
match_constraints
das Zusammensetzen auf zusammengesetzte Zeichen ganz rechts befindet, selbst wenn sehr kurzer Text vorhanden ist.app:layout_constraintWidth_default="wrap"
, und v1.0.2 der Bibliothek, aber es hilft nichtAktualisiert (ConstraintLayout 1.1. +)
Verwenden Sie
app:layout_constrainedWidth="true"
mitandroid:layout_width="wrap_content"
Zuvor (veraltet):
app:layout_constraintWidth_default="wrap"
mitandroid:layout_width="0dp"
quelle
Ja, wie in der Antwort von Nikolas Roard erwähnt , sollten Sie
app:layout_constraintWidth_default="wrap"
die Breite auf 0 dp hinzufügen und einstellen. Und um Ihre Blase richtig auszurichten, sollten Sie 1.0 für einstellenlayout_constraintHorizontal_bias
.Hier ist der endgültige Quellcode:
Als Ergebnis sieht es so aus:
quelle
app:layout_constraintHorizontal_bias="1.0"
Wie die anderen bereits erwähnten Antworten, ist es seit ConstraintLayout 1.0 möglich, dies zu erreichen, aber seit der neuesten Version (1.1.x) haben sie Ihre Vorgehensweise geändert.
Seit der Veröffentlichung von ConstraintLayout 1.1 sind das alte
app:layout_constraintWidth_default="wrap"
und dieapp:layout_constraintHeight_default="wrap"
Attribute veraltet .Wenn Sie ein zur Verfügung stellen mögen
wrap_content
Verhalten, aber immer noch die Einschränkungen auf Ihrer Ansicht durchzusetzen, sollten Sie die Breite und / oder Höhe auf ,wrap_content
kombiniert mit demapp:layout_constrainedWidth=”true|false”
und / oderapp:layout_constrainedHeight=”true|false”
Attribute, wie gesagt auf der Dokumentation :In Bezug auf die neueste Version befindet sich ConstraintLayout zum Zeitpunkt meiner Beantwortung in Version 1.1.2 .
quelle
@ nicolas-roards Antwort von
app:layout_constraintWidth_default="wrap"
undandroid:layout_width="0dp"
ist jetzt DEPRECATED .Gehen Sie voran und verwenden Sie
app:layout_constrainedWidth="true"
undandroid:layout_width="wrap_content"
.Den Grund für die Abwertung weiß ich nicht. Aber es ist richtig im Quellcode von ConstraintLayout
quelle
Ich benutze diesen
quelle
Sie sollten ersetzen
mit
aus Ihrer Textansicht und passen Sie dann Polsterung und Rand entsprechend an. Ich habe Ihren Code aktualisiert.
Sie erhalten dieses Ergebnis
quelle