4

我有一个布局

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/background"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:background="@drawable/chat_bg">

    <ImageView
        android:id="@+id/avatar"
        android:layout_width="32dip"
        android:layout_height="32dip"
        android:layout_marginRight="4dip"
        android:src="@drawable/avatar_1_1"        
        />

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5sp"
        />

</LinearLayout>

在我的java代码中:

LayoutParams lp1 = (LayoutParams) textView.getLayoutParams();
    LayoutParams lp2 = (LayoutParams) avatarView.getLayoutParams();
    if (incoming) {
        lp1.gravity = Gravity.LEFT;
        lp2.gravity = Gravity.LEFT;
        textView.setBackgroundResource(R.drawable.speech_bubble_green);
        textView.setLayoutParams(lp1);
        avatarView.setLayoutParams(lp2);
    } else {
        lp1.gravity = Gravity.RIGHT;
        lp2.gravity = Gravity.RIGHT;
        textView.setBackgroundResource(R.drawable.speech_bubble_orange);
        textView.setLayoutParams(lp1);
        avatarView.setLayoutParams(lp2);
    }

我希望传入消息及其头像将像 Viber 一样向右对齐,在左侧传出,但现在所有消息都向左对齐

感谢所有建议

4

2 回答 2

3
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/background"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        <!-- android:layout_gravity="left" -->
        android:orientation="horizontal">

        <ImageView
                android:id="@+id/avatar"
                android:layout_width="32dip"
                android:layout_height="32dip"
                android:layout_marginRight="4dip"
                android:src="@drawable/controller"
        />

        <TextView
                android:id="@+id/text"
                android:text="asd"
                android:textColor="#FFFFFF"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="5sp"
        />

</LinearLayout>

在 Activity 中设置重力:

LinearLayout lp = (LinearLayout) findViewById(R.id.background);
lp.setGravity(Gravity.RIGHT);
lp.setGravity(Gravity.Left);

所以,我唯一改变的是在你LinearLayout的 XML 文件中,layout_width从更改fill_parentwrap_content


编辑:(由于更多信息)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/background"
                android:layout_width="wrap_content"
                android:layout_height="fill_parent"
                android:layout_gravity="left"
                android:orientation="horizontal">


    <RelativeLayout android:id="@+id/avatar2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/text2">
        <ImageView
                android:id="@+id/avatar"
                android:layout_width="32dip"
                android:layout_height="32dip"
                android:layout_marginRight="4dip"
                android:src="@drawable/controller"
                />
    </RelativeLayout>

    <RelativeLayout android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toLeftOf="@id/avatar">
        <TextView
                android:id="@+id/text"
                android:text="asd"
                android:textColor="#FFFFFF"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                />
    </RelativeLayout>

</RelativeLayout>

所以,使用

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)yourLayout.getLayoutParams();
params.addRule(RelativeLayout.RIGHT_OF, R.id.id_to_be_left_of);
//params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);
yourLayout.setLayoutParams(params); //causes layout update

不要忘记依赖不能是循环的

于 2013-08-08T09:44:35.240 回答
1

解决方案在这里

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/background"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingRight="4dip"
android:paddingBottom="4dip"
android:background="@drawable/chat_bg">

<ImageView
    android:id="@+id/avatar"
    android:layout_width="32dip"
    android:layout_height="32dip"
    android:layout_marginLeft="4dip"
    android:src="@drawable/avatar_1_1"
    />

<TextView
    android:id="@+id/text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/avatar"
    android:paddingLeft="4dip"
    />

这里是java代码:

RelativeLayout bg = (RelativeLayout)view.findViewById(R.id.background);         
        if (incoming) {
            textView.setBackgroundResource(R.drawable.speech_bubble_orange);

            bg.setGravity(Gravity.LEFT);
        } else {
            textView.setBackgroundResource(R.drawable.speech_bubble_green);

            LayoutParams avatarParams = (LayoutParams) avatarView.getLayoutParams();
            avatarParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
            avatarView.setLayoutParams(avatarParams);

            /*android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_toRightOf="@id/avatar"
                    android:paddingLeft="4dip"*/
            LayoutParams tvParam = (LayoutParams) textView.getLayoutParams();
            tvParam.removeRule(RelativeLayout.RIGHT_OF);
            tvParam.addRule(RelativeLayout.LEFT_OF, R.id.avatar);
            textView.setLayoutParams(tvParam);

            bg.setGravity(Gravity.RIGHT);
        }
于 2013-08-15T03:23:49.390 回答