当内部视图与父右侧对齐时,RelativeLayout 背景会拉伸

Posted

技术标签:

【中文标题】当内部视图与父右侧对齐时,RelativeLayout 背景会拉伸【英文标题】:RelativeLayout background stretches when inner view aligned to parent right 【发布时间】:2014-03-25 17:36:48 【问题描述】:

下面的 XML 结果如下图。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/convoLayout"
    android:layout_
    android:layout_
    android:background="@drawable/right_bubble">

    <TextView
        android:id="@+id/convoBody"
        android:layout_
        android:layout_
        android:layout_alignParentRight="true"     // cause
        android:padding="5dp"
        android:text="test test test test"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

有谁知道如何让它看起来像这样:

注意:我需要 RelativeLayout,因为这是我的 XML 的简化版本 :)。

编辑:

让我也澄清一下。 TextView中没有android:layout_alignParentRight="true",布局如下图(右边有白边)

本质上,我需要左边的填充。

EDIT2:

为了进一步说明,@drawable/right_bubble 是一个 9-patch 图像,旨在动态拉伸以容纳内部视图,RelativeLayout 内部包含 3 个 TextView,其中9-patch 图像应该封装所有 3。

EDIT3:

这就是我想要的最终结果

【问题讨论】:

【参考方案1】:

您正在将背景设置为相对布局...因此,无论它拥有什么视图,整个布局都将具有相同的背景。尝试将 "android:background="@drawable/right_bubble" 设置为 TextView。

编辑(在得到 cmets 的回答后由 OP):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/convoLayout"
    android:layout_
    android:layout_
    android:layout_gravity="right"            // added
    android:background="@drawable/right_bubble" >

    <TextView
        android:id="@+id/convoBody"
        android:layout_
        android:layout_  // removed layout_alignParentRight
        android:padding="5dp"
        android:text="test test test test"
        android:textAppearance="?android:attr/textAppearanceMedium" />


</RelativeLayout>

【讨论】:

正如我的笔记所说,我需要将它放在 RelativeLayout 中,因为在聊天气泡中还有我需要的其他视图。如果我只为 TextView 设置背景,那么其余的视图将不会出现在气泡中。 好的,您是否考虑过在相对布局中使用框架布局来保存您的视图?您可以将 android:layout_alignParentRight="true" 设置为框架布局然后.. 你能澄清我如何使用 FrameLayout 来解决这个问题吗?我还要提一下,@drawable/right_bubble 是一个 9-patch 图像,旨在动态拉伸以容纳内部视图。 你能告诉我你希望你的屏幕是什么样子吗?包括您在聊天气泡中需要的其他视图... 这应该很容易...您是否尝试将您的 RelativeLayout 的 layout_gravity 设置为“正确”?它对我有用......【参考方案2】:

J.Ajendra 的回答让我大获全胜。他的回答(我在理解他的 cmets 后编辑)有效,但前提是 RelativeLayout 的容器尊重 android:layout_gravity。 (例如,如果我们要 Activity#setContentView(R.layout.convo_item))。

在我的例子中,convo_item.xml 将被膨胀到 ListView 中,它会覆盖 RelativeLayouts 的这种行为(我不知道为什么,但确实如此)导致聊天气泡始终位于左侧。为了解决这个问题,我简单地将RelativeLayout 包装在一个LinearLayout 中,该LinearLayout 占据了父母的整个宽度(android:layout_)并将其内容的重力设置为“right”(android:gravity="right")。结果,它适用于所有情况,包括 ListViews 和 Activity#setContentView(...)。

代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/convoOuterLayout"
    android:layout_
    android:layout_
    android:gravity="right" >

    <RelativeLayout
        android:id="@+id/convoLayout"
        android:layout_
        android:layout_
        android:background="@drawable/right_bubble" >

        <TextView
            android:id="@+id/convoBody"
            android:layout_
            android:layout_
            android:padding="5dp"
            android:text="test test test test"
            android:textAppearance="?android:attr/textAppearanceMedium" />
    </RelativeLayout>

</LinearLayout>

【讨论】:

以上是关于当内部视图与父右侧对齐时,RelativeLayout 背景会拉伸的主要内容,如果未能解决你的问题,请参考以下文章

被其他 TextView 挤压时的 TextView 和 Ellipsize

水平 ul 导航与右侧对齐

具有自定义视图的 UIBarButtonItem 在 iOS 7 上用作左侧或右侧导航栏项目时未正确对齐

UIBarButtonItem在用作左侧或右侧导航栏项目时,自定义视图未在iOS 7上正确对齐

无法使用约束右对齐视图

使用 Objective C 将集合视图单元格对齐到中心