聊天气泡布局问题:TextView填满整个屏幕

4
我正在开发气泡聊天功能。我使用了一个带有两个布局的适配器,一个用于传入信息,另一个用于我的信息。适配器工作正常。我的问题在于传入布局不能很好地显示传入时间文本。当消息文本增长时,填充整个屏幕宽度,并隐藏消息时间文本。
第一个问题:如何解决这个问题?
这是传入消息的布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal"
    android:animateLayoutChanges="true"
    android:gravity="left">

    <TextView
        android:id="@+id/message_text_server"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5sp"
        android:background="@drawable/speech_bubble_orange"
        android:shadowColor="@color/textShadow"
        android:shadowDx="1"
        android:shadowDy="1"
        android:text="Medium Text"
        android:textColor="@color/textColor"
        android:textSize="20sp" />

    <RelativeLayout
        android:id="@+id/message_server"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="left"
        android:layout_gravity="left" >
        
        <TextView
            android:id="@+id/sended_server"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="9dp"
            android:layout_marginTop="10sp"
            android:text="Enviado"
            android:textSize="10sp"
            android:visibility="gone" />        

        <TextView
            android:id="@+id/time_server"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="18dp"
            android:layout_marginTop="23dp"
            android:text="23:48"
            android:textSize="10sp" />
    </RelativeLayout>

</LinearLayout>
第二个问题 我的消息布局是相同的,但是元素的位置改变了而且能正常工作。为什么?
这是一个问题的图片: Image 编辑 当气泡里只有一个单词时,我需要橙色气泡与绿色气泡具有相同的行为,并在气泡充满文字时具有相同的行为(见绿色气泡)。 Image

我正在使用带有适配器的listView,适配器管理两个布局。这只是一个布局问题。 - Sangar82
你是否使用了两个不同的layout.xml来处理收到和发送的消息? - Haresh Chhelana
你希望在屏幕右侧看到时间吗? - Blackbelt
@Sangar82 请看下面我的回答。 - Marcin Orlowski
我需要橙色气泡在只有一个单词时具有与绿色气泡相同的行为,当气泡充满单词时也具有相同的行为(请参见绿色气泡)。http://i62.tinypic.com/2ur3rf7.jpg - Sangar82
显示剩余3条评论
4个回答

4

layout_weight属性设置为android:layout_weight="1",在两个气泡布局中的message_text_serverTextView对象上设置,以告诉父容器如何分配可用空间给其子元素。

结果(除去我删除的样式之外),您会得到正好想要的内容:

enter image description here

请查看文档或检查此问题的热门答案,了解有关layout_weight及其使用的更多信息。

编辑

您可能做错了什么,将父容器和服务器文本和日期文本视图字段的宽度设置为match_parent,并且服务器文本layout_width应该足以获得两个气泡的效果。

编辑 2

您在布局中(滥)使用了边距和填充。

我需要橙色气泡在只有一个单词时与绿色气泡具有相同的行为,并在气泡充满单词时具有相同的行为(参见绿色气泡)

您只需要调整server_text TextView的layout_widthlayout_gravity即可。这是正确的布局截图:

enter image description here

然后是其背后的布局。不需要填充/边距。只需使用gravity和播放宽度heightwidth加上weight。稍后随意样式化即可:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:animateLayoutChanges="true"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left">
        <TextView
            android:id="@+id/TextView02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5sp"
            android:layout_weight="1"
            android:text="Foo bar foo foo foo"
            android:textSize="20sp" />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="vertical">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:text="Enviado"
                android:textSize="10sp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:text="23:48"
                android:textSize="10sp" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="vertical">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:text="Enviado"
                android:textSize="10sp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:text="23:48"
                android:textSize="10sp" />
        </LinearLayout>
        <TextView
            android:id="@+id/TextView01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5sp"
            android:layout_weight="1"
            android:text="Foo bar foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo"
            android:textSize="20sp" />
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left">
        <TextView
            android:id="@+id/TextView02"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5sp"
            android:layout_weight="1"
            android:text="Foo bar foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo foo"
            android:textSize="20sp" />
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="vertical">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:text="Enviado"
                android:textSize="10sp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left"
                android:text="23:48"
                android:textSize="10sp" />
        </LinearLayout>
    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            android:orientation="vertical">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:text="Enviado"
                android:textSize="10sp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:text="23:48"
                android:textSize="10sp" />
        </LinearLayout>
        <TextView
            android:id="@+id/TextView01"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="5sp"
            android:layout_weight="1"
            android:text="Foo bar foo foo"
            android:textSize="20sp" />
    </LinearLayout>

</LinearLayout>

基本上不需要填充/边距。

谢谢您的回复。我之前尝试过这个方法。这是结果:http://i62.tinypic.com/2ur3rf7.jpg 行为必须与绿色气泡相同。 - Sangar82
@Sangar82 请查看第二次编辑。 - Marcin Orlowski
第一个和最后一个线性布局(橙色气泡)不同。我只使用一个布局来处理所有传入的消息,另一个用于传出的消息。在这里,您正在使用两个不同的布局。我只需要一个布局。您可以为长文本创建一个布局,为短文本创建另一个布局,而不是将两个布局合并为一个布局。 - Sangar82
现在你有一个用于左侧气泡的布局和一个用于右侧气泡的布局。 - Marcin Orlowski

1

添加

 android:layout_weight="1"

将文本添加到带气泡的TextView中。这样,它应该占据所有空间,除了RelativeLayout所需的空间。
编辑:
根布局的高度应为wrap_content,还需要为内部RelativeLayout的子项分配位置:android:layout_below="@id/sended_server"android:layout_alignWithParentIfMissing="true"应用于具有ID time_serverTextView,就可以解决问题了。

感谢您的回复。我之前尝试过这个方法,这是结果:http://i62.tinypic.com/2ur3rf7.jpg 行为必须与绿色气泡相同。 - Sangar82
@Sangar82 这很奇怪。尝试在气泡的文本视图中使用 android:layout_width="0dip" 而不是 wrap_content - Blackbelt
根LinearLayout的高度应为wrap_content。另外,从RelativeLayout中删除TextView的margin属性,以缩小问题范围。 - Blackbelt
看起来有点奇怪,不是吗?你能否移除“enviado”的android:visibility="gone"属性,以便查看它的外观如何? - Blackbelt
将消息的时间和位置放在同一位置。我使用了边距来定位它。 - Sangar82
显示剩余2条评论

0
使用 RelativeLayout 实现这个功能:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:animateLayoutChanges="true" >

    <RelativeLayout
        android:id="@+id/message_server"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_gravity="left"
        android:gravity="left" >

        <TextView
            android:id="@+id/sended_server"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="9dp"
            android:layout_marginTop="10sp"
            android:text="Enviado"
            android:textSize="10sp"
            android:visibility="gone" />

        <TextView
            android:id="@+id/time_server"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="18dp"
            android:layout_marginTop="23dp"
            android:text="23:48"
            android:textSize="10sp"
            android:background="@drawable/speech_bubble_orange"
            android:shadowColor="@color/textShadow"
            android:textColor="@color/textColor />
    </RelativeLayout>

    <TextView
        android:id="@+id/message_text_server"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_margin="5sp"
        android:layout_toLeftOf="@id/message_server"
        android:shadowDx="1"
        android:shadowDy="1"
        android:text="Medium Text"
        android:textSize="20sp" />

</RelativeLayout>

-1

首先尝试这个:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:animateLayoutChanges="true"
    android:gravity="left"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/message_text_server"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="5sp"
        android:layout_weight="1"
        android:background="@android:color/holo_orange_light"
        android:shadowColor="@android:color/darker_gray"
        android:shadowDx="1"
        android:shadowDy="1"
        android:text="Medium Text"
        android:textColor="@android:color/white"
        android:textSize="20sp" />

    <RelativeLayout
        android:id="@+id/message_server"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="left"
        android:gravity="left" >

        <TextView
            android:id="@+id/sended_server"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="9dp"
            android:layout_marginTop="10sp"
            android:text="Enviado"
            android:textSize="10sp"
            android:visibility="visible" />

        <TextView
            android:id="@+id/time_server"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="18dp"
            android:layout_marginTop="23dp"
            android:text="23:48"
            android:textSize="10sp" />
    </RelativeLayout>

</LinearLayout>

其次,

如果你改变属性的位置,将时间文本视图放在前面,留言文本视图放在后面,那么时间文本视图会得到它所需的空间,剩余的空间会分配给第二个文本视图,所以当你改变属性位置时,它可以正常工作。


谢谢您的回复,但是结果并不如预期。http://es.tinypic.com/r/3fsyg/8 - Sangar82

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