Android 在RelativeLayout中正确对齐文本视图

Android 在RelativeLayout中正确对齐文本视图,android,android-layout,android-relativelayout,Android,Android Layout,Android Relativelayout,我正在为一门大学课程开发一个即时消息应用程序,类似于Whatsapp,因为你可以猜到在附带的屏幕截图中看到了图标:) 我有一个用自定义游标适配器填充的ListFragment。它提供两种类型的视图:发送消息(向右对齐)和接收消息(向左对齐) 发送消息的布局工作得很好,但我不能对接收到的消息说同样的话 android:layout_toLeftOf="@+id/cei_timestamp" 以下是一个屏幕截图: 已发送邮件布局: <?xml version="1.0" encoding

我正在为一门大学课程开发一个即时消息应用程序,类似于Whatsapp,因为你可以猜到在附带的屏幕截图中看到了图标:)

我有一个用自定义游标适配器填充的ListFragment。它提供两种类型的视图:发送消息(向右对齐)和接收消息(向左对齐)

发送消息的布局工作得很好,但我不能对接收到的消息说同样的话

 android:layout_toLeftOf="@+id/cei_timestamp"
以下是一个屏幕截图:

已发送邮件布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="#FFCCCCCC"
        android:padding="5dp" >

        <TextView
            android:id="@+id/ceo_timestamp"
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:background="#FFBBBBBB"
            android:gravity="center"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/ceo_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/ceo_timestamp"
            android:background="#FFAAAAAA"
            android:gravity="right"
            android:textSize="16sp" />
    </RelativeLayout>

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="left" >

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="#FF999999"
        android:padding="5dp" >

        <TextView
            android:id="@+id/cei_timestamp"
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="#FF888888"
            android:gravity="center"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/cei_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/cei_timestamp"
            android:background="#FF777777"
            android:gravity="right"
            android:textSize="16sp" />
    </RelativeLayout>

</RelativeLayout>

接收到的消息布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:background="#FFCCCCCC"
        android:padding="5dp" >

        <TextView
            android:id="@+id/ceo_timestamp"
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:background="#FFBBBBBB"
            android:gravity="center"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/ceo_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toRightOf="@+id/ceo_timestamp"
            android:background="#FFAAAAAA"
            android:gravity="right"
            android:textSize="16sp" />
    </RelativeLayout>

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="left" >

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="#FF999999"
        android:padding="5dp" >

        <TextView
            android:id="@+id/cei_timestamp"
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:background="#FF888888"
            android:gravity="center"
            android:textSize="10sp" />

        <TextView
            android:id="@+id/cei_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/cei_timestamp"
            android:background="#FF777777"
            android:gravity="right"
            android:textSize="16sp" />
    </RelativeLayout>

</RelativeLayout>

添加这些难看的背景色只是为了查看每个视图和布局占用的空间。正如您在屏幕截图中看到的,发送消息(右对齐)效果很好。收到的消息(左对齐)对齐不好,因为RelativeLayout占用了所有可用的水平空间,而不仅仅是包装内容

有人知道如何修复它,或者是更好的布局设计来完成我所需要的吗


非常感谢。

在发送消息布局中,用android:layout\u alignParentRight=“true”参数替换android:layout\u alignParentLeft=“true”。

RelativeLayout
的子项为
alignParentRight
时,其宽度将自动更改为
匹配父项
TextView
cei\u时间戳的
android:layout\u alignParentRight=“true”
使其父级的宽度从
wrap\u content
更改为
match\u parent
静默。
你有两种纠正方法:

  • 不要使用
    RelativeLayout

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:background="#FF999999"
            android:padding="5dp" >
    
            <TextView
                android:id="@+id/cei_text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:background="#FF777777"
                android:gravity="right"
                android:textSize="16sp" />
    
            <TextView
                android:id="@+id/cei_timestamp"
                android:layout_width="60sp"
                android:layout_height="wrap_content"
                android:background="#FF888888"
                android:gravity="center"
                android:textSize="10sp" />
    
        </LinearLayout>
    
    </RelativeLayout>
    
    
    

  • 不要使用
    wrap_内容
    ,两者都使用特定宽度,如
    60dp

  • 我知道已经很晚了,但我正在为寻找相同问题解决方案的人发布。 要将收到的消息向左对齐,只需从xml格式的第二个文本视图中删除这一行即可

     android:layout_toLeftOf="@+id/cei_timestamp"
    
    我尝试了一个简单的例子,它的工作。 这是代码和屏幕截图

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.example.android.myapplication1.MainActivity">
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#FF4081">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="60sp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:gravity="center"
            android:text="Hello"
            android:textSize="23sp" />
    
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/textView"
            android:gravity="right"
            android:text="New Text"
            android:textColor="#FFF"
            android:textSize="23sp" />
    </RelativeLayout>
    
    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout centerHorizontal="true"
        android:layout marginTop = "104dp"
        android:text="New Button" /></RelativeLayout>`
    
    
    `
    

    +1获取一个屏幕截图,该屏幕截图讲述了所有故事…:)当你有工作要做,又没有时间的时候,这些愚蠢的事情和咖啡是很好的选择:)+1用于你的屏幕截图。谢谢你的快速回答!我试过了,对齐效果很好,但与预期相反。我希望将已发送的消息发送到右侧,将已接收的消息发送到左侧。因此,您可以在任何需要的地方更改左侧和右侧的对齐方式。:)