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

时间:2012-11-21 07:05:40

标签: android relativelayout

我正在制作聊天应用。我想把时间戳放在聊天泡泡旁边。消息将左对齐(已接收)和右(已发送)。

所以,我正在寻找一种方法将toLeftOf更改为toRightOf。现在,它看起来像这样:

Timestamp wrongly aligned

这是我的每条消息的XML代码(我有ArrayAdapter处理这个)

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

我在Google上搜索并发现了这一点,但无效:

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 个答案:

答案 0 :(得分:11)

尝试从任意视图中删除 toRightOf toLeftOf 属性。我将从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 :(得分:2)

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

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

(注意,API 17引入了removeRule(),但这还没有帮助。)

答案 2 :(得分:0)

请在下面的代码中使用。

RelativeLayout wrapper = (RelativeLayout) findViewById(R.id.wrapper);
if(isReceivedMessage){
    wrapper.setGravity(Gravity.RIGHT);
}
else{
    wrapper.setGravity(Gravity.LEFT);
}