泡泡聊天布局

时间:2013-08-08 09:37:59

标签: android android-layout

我有一个布局

<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对齐正确,在左侧上传出,但现在所有消息都对齐

感谢所有建议

2 个答案:

答案 0 :(得分: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>

在您的活动中设置重力:

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

所以,我改变的唯一内容是在LinearLayout的XML文件中,将layout_widthfill_parent更改为wrap_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

不要忘记依赖不能是循环

答案 1 :(得分: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);
        }