Saya mencoba menerapkan gelembung obrolan sederhana menggunakan a ConstraintLayout
. Inilah yang saya coba capai:
Namun, wrap_content
sepertinya tidak berfungsi dengan baik dengan kendala. Itu menghormati margin, tetapi tidak menghitung ruang yang tersedia dengan benar. Inilah tata letak saya:
<?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>
Ini membuat sebagai berikut:
Saya menggunakan com.android.support.constraint:constraint-layout:1.0.0-beta4
.
Apakah saya melakukan sesuatu yang salah? Apakah itu bug atau hanya perilaku yang tidak intuitif? Dapatkah saya mencapai perilaku yang tepat menggunakan a ConstraintLayout
(Saya tahu saya bisa menggunakan tata letak lain, saya bertanya ConstrainLayout
secara spesifik).
android
android-layout
android-constraintlayout
Marcin Jedynak
sumber
sumber
tools:background="@drawable/chat_message_bubble"
. Untuk menerapkannya, Anda harus membuat file chat_message_bubble.xml di folder drawable kemudian tambahkan kode ini:<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Jawaban:
Kedaluwarsa: Lihat jawaban yang lebih baik
Tidak, Anda tidak dapat melakukan apa yang Anda inginkan dengan ConstraintLayout seperti sekarang (1.0 beta 4):
wrap_content
hanya meminta widget untuk mengukur sendiri, tetapi tidak akan membatasi ekspansi terhadap kendala yang akhirnyamatch_constraints
(0dp) akan membatasi ukuran widget terhadap batasan ... tetapi akan mencocokkannya meskipun ukurannyawrap_content
lebih kecil (contoh pertama Anda), yang juga bukan yang Anda inginkan.Jadi sekarang, Anda kurang beruntung untuk kasus tertentu: - /
Sekarang ... kami sedang berpikir tentang menambahkan kemampuan ekstra
match_constraints
untuk menangani skenario yang tepat ini (berlaku sebagaiwrap_content
-olah ukurannya lebih dari kendala).Saya tidak bisa menjanjikan bahwa fitur baru ini akan membuatnya sebelum rilis 1.0 sekalipun.
Sunting : kami menambahkan kemampuan ini di 1.0 dengan atribut
app:layout_constraintWidth_default="wrap"
(dengan lebar diatur ke 0dp). Jika disetel, widget akan memiliki ukuran yang sama seperti jika menggunakan wrap_content, tetapi akan dibatasi oleh batasan (artinya tidak akan meluas di luarnya)Perbarui Sekarang tag-tag tersebut sudah tidak digunakan lagi, sebagai gantinya gunakan layout_width = "WRAP_CONTENT" dan layout_constrainedWidth = "true".
sumber
match_constraints
drawable gabungan akan berada di sebelah kanan, bahkan jika ada teks yang sangat pendek.app:layout_constraintWidth_default="wrap"
juga menggunakan , dan v1.0.2 dari perpustakaan tetapi tidak membantuDiperbarui (ConstraintLayout 1.1. +)
Gunakan
app:layout_constrainedWidth="true"
denganandroid:layout_width="wrap_content"
Sebelumnya (usang):
app:layout_constraintWidth_default="wrap"
denganandroid:layout_width="0dp"
sumber
Yap, seperti disebutkan dalam jawaban yang diberikan oleh Nikolas Roard, Anda harus menambahkan
app:layout_constraintWidth_default="wrap"
dan mengatur lebar ke 0dp. Dan untuk meluruskan gelembung Anda, Anda harus mengatur 1,0 untuklayout_constraintHorizontal_bias
.Berikut kode sumber terakhir:
Hasilnya terlihat seperti:
sumber
app:layout_constraintHorizontal_bias="1.0"
Seperti jawaban lain yang sudah dikatakan, karena ConstraintLayout 1.0 dimungkinkan untuk mencapai itu, tetapi pada rilis terbaru (1.1.x) mereka telah mengubah cara Anda melakukannya.
Sejak rilis ConstraintLayout 1.1 yang lama
app:layout_constraintWidth_default="wrap"
danapp:layout_constraintHeight_default="wrap"
atribut sekarang sudah usang .Jika Anda ingin memberikan
wrap_content
perilaku, tetapi tetap memberlakukan batasan pada Tampilan Anda, Anda harus mengatur lebar dan / atau tingginya untukwrap_content
digabungkan denganapp:layout_constrainedWidth=”true|false”
dan / atauapp:layout_constrainedHeight=”true|false”
atribut, sebagaimana dinyatakan pada dokumen :Adapun rilis terbaru, pada saat saya sudah menjawab ini, ConstraintLayout ada di versi 1.1.2 .
sumber
@ nicolas-roard menjawab
app:layout_constraintWidth_default="wrap"
danandroid:layout_width="0dp"
sekarang DIHAPUSKAN .Silakan dan gunakan
app:layout_constrainedWidth="true"
danandroid:layout_width="wrap_content"
.Alasan penghinaan, saya tidak tahu. Tetapi haknya dalam kode sumber ConstraintLayout
sumber
Saya menggunakan yang ini
sumber
Anda harus mengganti
dengan
dari TextView Anda dan kemudian sesuaikan bantalan dan margin sesuai. Saya telah memperbarui kode Anda,
Anda akan mendapatkan hasil ini
sumber