Estou tentando implementar um simples balão de bate-papo usando um ConstraintLayout
. Isto é o que estou tentando alcançar:
No entanto, wrap_content
parece não funcionar corretamente com restrições. Ele respeita as margens, mas não calcula o espaço disponível corretamente. Aqui está o meu 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>
Isso renderiza da seguinte maneira:
Eu estou usando com.android.support.constraint:constraint-layout:1.0.0-beta4
.
Estou fazendo algo errado? É um bug ou apenas um comportamento não intuitivo? Posso obter o comportamento adequado usando a ConstraintLayout
(sei que posso usar outros layouts, estou perguntando ConstrainLayout
especificamente).
android
android-layout
android-constraintlayout
Marcin Jedynak
fonte
fonte
tools:background="@drawable/chat_message_bubble"
. Para implementá-lo, você deve criar o arquivo chat_message_bubble.xml na pasta drawable e adicionar este código:<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Respostas:
Desatualizado: veja melhor resposta
Não, você não pode fazer o que deseja com o ConstraintLayout como é hoje (1.0 beta 4):
wrap_content
solicita apenas que o widget se avalie, mas não limitará sua expansão a eventuais restriçõesmatch_constraints
(0dp) vai limitar o tamanho do widget contra as restrições ... mas irá combiná-los, mesmo quewrap_content
teria sido menor (seu primeiro exemplo), o que não é o que você quer, quer.Então, agora, você está sem sorte nesse caso em particular: - /
Agora ... estamos pensando em adicionar recursos extras
match_constraints
para lidar com esse cenário exato (comportando-se como awrap_content
menos que o tamanho termine sendo mais do que as restrições).Não posso prometer que esse novo recurso o fará antes do lançamento da versão 1.0.
Editar : adicionamos esse recurso na
app:layout_constraintWidth_default="wrap"
versão 1.0 com o atributo (com largura definida como 0dp). Se definido, o widget terá o mesmo tamanho que o wrap_content, mas será limitado por restrições (ou seja, não será expandido além delas)Atualizar Agora essas tags estão obsoletas. Em vez disso, use layout_width = "WRAP_CONTENT" e layout_constrainedWidth = "true".
fonte
match_constraints
drawable composto estará à direita, mesmo se houver texto muito curto.app:layout_constraintWidth_default="wrap"
também, e v1.0.2 da biblioteca mas não ajudaAtualizado (ConstraintLayout 1.1. +)
Use
app:layout_constrainedWidth="true"
comandroid:layout_width="wrap_content"
Anteriormente (descontinuado):
app:layout_constraintWidth_default="wrap"
comandroid:layout_width="0dp"
fonte
Sim, como mencionado na resposta dada por Nikolas Roard, você deve adicionar
app:layout_constraintWidth_default="wrap"
e definir a largura como 0dp. E para alinhar sua bolha corretamente, defina 1.0 paralayout_constraintHorizontal_bias
.Aqui está o código fonte final:
Como resultado, parece com:
fonte
app:layout_constraintHorizontal_bias="1.0"
Como as outras respostas já mencionadas, desde o ConstraintLayout 1.0 é possível conseguir isso, mas a partir da versão mais recente (1.1.x) elas mudaram a maneira como você faz isso.
Desde o lançamento do ConstraintLayout 1.1, os atributos antigo
app:layout_constraintWidth_default="wrap"
e agora estão obsoletos .app:layout_constraintHeight_default="wrap"
Se você deseja fornecer um
wrap_content
comportamento, mas ainda aplicar as restrições em sua Visualização, defina sua largura e / ou altura parawrap_content
combinadas com os atributosapp:layout_constrainedWidth=”true|false”
e / ouapp:layout_constrainedHeight=”true|false”
, conforme indicado nos documentos :Quanto à versão mais recente, no momento em que eu respondo isso, o ConstraintLayout está na versão 1.1.2 .
fonte
A resposta de @ nicolas-roard
app:layout_constraintWidth_default="wrap"
eandroid:layout_width="0dp"
agora é DEPRECADA .Vá em frente e use
app:layout_constrainedWidth="true"
eandroid:layout_width="wrap_content"
.O motivo da depreciação, eu não sei. Mas está certo no código fonte do ConstraintLayout
fonte
Eu uso esse
fonte
Você deve substituir
com
do TextView e ajuste o preenchimento e a margem de acordo. Eu atualizei seu código,
Você obterá este resultado
fonte