当内部视图与父右侧对齐时,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
具有自定义视图的 UIBarButtonItem 在 iOS 7 上用作左侧或右侧导航栏项目时未正确对齐