Search code examples
androidandroid-layouttextview

Whatsapp Message Layout - How to get time-view in the same row


I was wondering how WhatsApp handles the time shown in every message.

For those who don't know:

  1. If the message is very short, the text and time are in the same row.
  2. If the message is long, the time is in the bottom right corner - the text wrapped around it.

With a RelativeLayout and toLeftOf I would get 1) but not 2) as previous lines would be "cut off" at the position of the time view. Same behaviour If i use a LinearLayout.

So I tried to use a FrameLayout or a RelativeLayout without any connection between text and time.

However, if the text is as long as the message-view is big, both views would overlap. If I put blank characters to my message I wouldn't have the time on the right.

Do they really have some kind of text-wrapping-lib for this or is it possible to do only with layouts?

Here is the requested screenshot:

enter image description here


Solution

  • Adding HTML non-breaking spaces did the trick. Tested the code on most devices and working absolutely fine. Maybe whatsapp is also doing the same thing. Below is the chat code:

    See images below to see it working.

    XML Design:

    <RelativeLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/rel_layout_left"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtDate"
        android:visibility="visible"
        android:orientation="vertical"
       >
    
        <TextView
            android:id="@+id/lblMsgFrom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:text="kfhdjbh"
            android:textColor="@color/lblFromName"
            android:textSize="12dp"
            android:textStyle="italic"
            android:visibility="gone" />
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_below="@+id/lblMsgFrom"
            android:layout_marginRight="-5dp"
            android:src="@drawable/bubble_corner" />
    
        <FrameLayout
            android:orientation="horizontal"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:background="@drawable/bg_msg_from"
            android:layout_toRightOf="@+id/imageView">
    
            <TextView
                android:id="@+id/txtTimeFrom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingRight="@dimen/d5"
                android:text="Time"
                android:textColor="@android:color/darker_gray"
                android:layout_gravity="bottom|right"
                android:padding="4dp"
                android:textSize="10dp"
                android:textStyle="italic"
                android:layout_below="@+id/txtMsgFrom"
                android:layout_alignRight="@+id/txtMsgFrom"
                android:layout_alignEnd="@+id/txtMsgFrom" />
    
           <TextView
                android:id="@+id/txtMsgFrom"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignTop="@+id/imageView"
                android:layout_toEndOf="@+id/lblMsgFrom"
                android:layout_toRightOf="@+id/imageView"
                android:paddingLeft="10dp"
                android:paddingRight="10dp"
                android:paddingTop="5dp"
                android:paddingBottom="5dp"
                android:text="kdfjhgjfhf"
                android:textColor="@color/black"
                android:textSize="16dp"
                android:layout_alignParentLeft="true"
                android:layout_marginLeft="0dp"
                android:layout_alignParentTop="true"
                android:layout_marginTop="0dp"
                android:layout_gravity="left|center_vertical" />
        </FrameLayout>
    
    </RelativeLayout>
    

    Code: bg_msg_from.xml

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android"
        android:shape="rectangle" >
    
        <!-- view background color -->
        <!--<solid android:color="@color/bg_msg_from" >-->
        <solid android:color="@android:color/white" >
        </solid>
    
        <corners android:radius="@dimen/d5" >
        </corners>
    
    </shape>
    

    ** File: bubble_corner.png**

    Right Arrow Image enter image description here

    enter image description here enter image description here enter image description here

    txtMsgFrom.setText(Html.fromHtml(convertToHtml(txtMsgFrom.getText().toString()) + " &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;")); // 10 spaces