ConstraintLayout内部的Wrap_content视图延伸到屏幕外部


132

我正在尝试使用来实现一个简单的聊天气泡ConstraintLayout。这是我要实现的目标:

在此处输入图片说明 在此处输入图片说明

但是,wrap_content似乎不能在约束条件下正常工作。它尊重边距,但不能正确计算可用空间。这是我的布局:

<?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>

如下所示:

在此处输入图片说明

我正在使用com.android.support.constraint:constraint-layout:1.0.0-beta4

难道我做错了什么?它是错误还是只是非直觉的行为?ConstraintLayout我可以使用来实现正确的行为吗(我知道我可以使用其他布局,我正在ConstrainLayout专门询问)。


您可以发布文本视图及其父约束布局吗?如您所知,父母布局的属性对孩子有很大影响
Mohammed Atif

顺便说一句,在您的情况下,我猜想水平偏差是元凶。尝试删除右偏的右偏布局
Mohammed Atif

1
需要水平偏置,否则气泡会居中。没有正确的布局,就不会考虑右边距,这不是我们想要的。我尝试按照您的建议将其删除,但没有帮助。
Marcin Jedynak '16

1
问题肯定是水平偏置0。我将检查可能的解决方案并将其尽快发布,因为我也在处理约束布局上的类似问题。
Mohammed Atif

1
@nmu聊天气泡来自tools:background="@drawable/chat_message_bubble"。要实现它,您必须在drawable文件夹中创建chat_message_bubble.xml文件,然后添加以下代码: <shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FB4382"/> <corners android:radius="10dip"/> </shape>
Eugene Brusov

Answers:


242

过时的:看到更好的答案

不,您不能像今天(1.0 beta 4)那样使用ConstraintLayout来做您想做的事情:

  • wrap_content 仅要求窗口小部件进行自我测量,但不会限制其扩展不受最终限制
  • match_constraints(0dp)限制控件的大小...但是即使它们wrap_content较小(您的第一个示例),它们也会匹配它们,这也不是您想要的。

所以,现在,您在这种情况下不走运:-/

现在...我们正在考虑添加额外的功能来match_constraints处理这种确切的情况(行为wrap_content除非大小超出限制)。

我不能保证这个新功能会在1.0版本之前实现。

编辑:我们确实在1.0中添加了此功能的属性app:layout_constraintWidth_default="wrap"(宽度设置为0dp)。如果设置,则小部件将具有与使用wrap_content相同的大小,但是将受到约束的限制(即,它将不会扩展到它们之外)

更新 现在不赞成使用这些标签,而应使用layout_width =“ WRAP_CONTENT”和layout_constrainedWidth =“ true”。


1
那对我来说是一个超级问题。我现在无法将TextView与复合可绘制对象一起使用,因为如果将其设置为match_constraints复合可绘制对象,即使在文本很短的情况下,它也将位于最右边。
Paul Woitaschek '17

2
@NicolasRoard:您能帮我约束布局吗,我在上半部有一个图像,其准则是0.4,下面是内容,但是当我将约束布局设置为wrap_content时,它只会选择屏幕的0.4(一半是下面的textviews是不可见的),我也使用app:layout_constraintWidth_default="wrap"过,并且使用了该库的v1.0.2,但它没有帮助
Rat-a-tat-a-tat Ratatouille

3
app:layout_constraintWidth_default =“ wrap”,宽度为0dp很好!
Tunji_D

11
在文档/说明中应明确说明。
SQLiteNoob

6
编辑是否应该具有更大的知名度?某种迷失在原作之下。欣赏答案。谢谢@NicolasRoard。
汤姆·霍华德

276

更新(ConstraintLayout 1.1。+)

使用app:layout_constrainedWidth="true"android:layout_width="wrap_content"

以前(不推荐使用):

app:layout_constraintWidth_default="wrap"android:layout_width="0dp"


5
没错,自ConstraintLayout 1.1.0 beta 2起,我相信。androidstudio.googleblog.com/2017/10/...
菲费尔羊


爱stackoverflow!谢谢,这对我有所帮助!保留换行内容,但不要超出限制!#TIL
丹尼斯·安德森

什么答案,不知道这个存在!谢谢男人,经过2个小时的替代品测试后,这确实很划算!
dev2505

23

是的,正如Nikolas Roard给出的答案中所述,您应该添加app:layout_constraintWidth_default="wrap"宽度并将其设置为0dp。为了使气泡正确对齐,您应该将设置为1.0 layout_constraintHorizontal_bias

这是最终的源代码:

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/chat_message"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:padding="16dp"
        android:layout_marginTop="8dp"
        android:layout_marginStart="64dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintWidth_default="wrap"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:background="@drawable/chat_message_bubble"
        android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

</android.support.constraint.ConstraintLayout>

结果,它看起来像:

在此处输入图片说明


我认为这是因为OP希望左侧留小气泡,而您的右侧是小气泡,这会更改要求
Waza_Be

2
这里重要的部分是app:layout_constraintHorizontal_bias="1.0"
Lester

9

就像已经说过的其他答案一样,自ConstraintLayout 1.0起,就可以实现这一点,但是从最新版本(1.1.x)开始,它们已经改变了您的操作方式。

自ConstraintLayout 1.1发行以来,不推荐使用 old app:layout_constraintWidth_default="wrap"app:layout_constraintHeight_default="wrap"属性。

如果您想提供一种wrap_content行为,但仍对View施加约束,则应将其宽度和/或高度设置为wrap_contentapp:layout_constrainedWidth=”true|false”和/或app:layout_constrainedHeight=”true|false”属性结合使用,如docs所述

WRAP_CONTENT:强制约束(在1.1中添加)如果将维度设置为WRAP_CONTENT,则在1.1之前的版本中,它们将被视为文字维度-意味着,约束不会限制结果维度。通常,这足够了(并且更快),但在某些情况下,您可能想使用WRAP_CONTENT,但仍要强制执行约束以限制结果尺寸。在这种情况下,您可以添加相应的属性之一:

app:layout_constrainedWidth =“ true | false” app:layout_constrainedHeight =“ true | false”

至于最新版本,在我回答此问题时,ConstraintLayout处于版本1.1.2上


3

弃用app:layout_constraintWidth_default文本及其替代方法

@萨科-roard的回答app:layout_constraintWidth_default="wrap"android:layout_width="0dp"现在不推荐使用

继续使用app:layout_constrainedWidth="true"android:layout_width="wrap_content"

我不知道弃用的原因。但是它在ConstraintLayout的源代码中正确


-7

我用这个

app:layout_constraintEnd_toEndOf="parent"

这是OP的问题吗?如何包装内容?
亚历克斯

-8

你应该更换

android:layout_width="wrap_content"

android:layout_width="match_parent"

从您的TextView中,然后相应地调整填充和边距。我已经更新了您的代码,

<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="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="8dp"
    android:layout_marginEnd="10dp"
    android:layout_marginLeft="60dp"
    android:layout_marginRight="10dp"
    android:layout_marginStart="60dp"
    android:layout_marginTop="8dp"
    android:padding="16dp"
    app:layout_constraintTop_toTopOf="parent"
    tools:background="#c9c7c7"
    tools:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Mauris sodales accumsan tortor at bibendum." />

你会得到这个结果 在此处输入图片说明


您应该避免对ConstraintLayout中的任何视图使用“ match_parent”。在此处
尤金·布鲁索夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.