以编程方式将RelativeLayout中的toRightOf更改为toLeftOf

8
我在开发聊天应用,希望将时间戳放在聊天气泡旁边。消息将被左对齐(接收)和右对齐(发送)。因此,我正在寻找一种方法将“toLeftOf”更改为“toRightOf”。目前,它看起来像这样:
以下是每条消息的XML代码(我有一个处理此操作的ArrayAdapter)。但是,时间戳显示不正确,如下图所示: Timestamp wrongly aligned
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/wrapper"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" >

        <TextView
            android:id="@+id/bubble"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#ffffff" />

        <TextView
            android:id="@+id/timeStamp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/bubble" />

</RelativeLayout>

我上网搜索并找到了这个,但是它不起作用:


RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
     RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
if(isReceivedMessage){
    params.addRule(RelativeLayout.RIGHT_OF, R.id.bubble);
}
else{
    params.addRule(RelativeLayout.LEFT_OF, R.id.bubble);
}
timeStampTextView.setLayoutParams(params);

有什么解决方案吗?谢谢。
3个回答

11

尝试以下方法以从任何视图中删除toRightOftoLeftOf属性。我正在从TextView中移除这些属性。

    TextView header2=(TextView) findViewById(R.id.text_view_header_shoppinglist);
        RelativeLayout.LayoutParams mLayoutParams2=(RelativeLayout.LayoutParams)header2.getLayoutParams();
        mLayoutParams2.addRule(RelativeLayout.LEFT_OF,0);
        mLayoutParams2.addRule(RelativeLayout.RIGHT_OF,0);

1
谢谢。我已经用上面的答案解决了这个问题,但下次我会尝试这个方法。 - hrsetyono

2

重写
从当前TextView中删除属性layout_toRightOf,然后创建两个不同的LayoutParams:一个用于toRightOf,另一个用于toLeftOf。您可以根据需要切换参数。

另一种方法是使用带有两个布局的自定义适配器。这种方法应该更快,因为您不会在运行时重新排列布局,而是在视图回收器中维护“回复”和“发送”布局的两个单独列表。

(请注意,API 17引入了removeRule(),但目前还不能帮助解决问题。)


我似乎找不到removeRule()方法。那是内置的还是我们必须先创建? - hrsetyono
1
对不起,这只是在API 17中添加的(http://developer.android.com/reference/android/widget/RelativeLayout.LayoutParams.html#removeRule%28int%29)......这对当前设备没有帮助。但我仍然相信多布局方法是最好的。 - Sam
等等,你尝试过使用两个不同的LayoutParams吗?并通过tv.setLayoutParams(leftParams)来切换它们吗? - Sam
如果您需要的话,这里有一个关于如何在自定义适配器中使用多个布局的通用解释,如果您需要更具体的建议,请随时提问。 - Sam
可以使用addRule(RelativeLayout.[必需的规则], 0)代替removeRule()来支持旧的API级别。 - Ammar
显示剩余2条评论

0
请使用以下代码。
RelativeLayout wrapper = (RelativeLayout) findViewById(R.id.wrapper);
if(isReceivedMessage){
    wrapper.setGravity(Gravity.RIGHT);
}
else{
    wrapper.setGravity(Gravity.LEFT);
}

那段代码是用来将聊天气泡向右对齐的吗?我已经做过了。 - hrsetyono
实际上我正在寻找一种改变时间戳位置的方法。我已经有了对齐气泡的代码。 - hrsetyono
请删除您之前发布的所有规则。只需按照您的图片显示我的代码。只需放置我的代码。两者都向右对齐和两者都向左对齐。 - Nikhil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接