当TextView与另一个TextView重叠时剪切文本并添加省略号

时间:2015-07-30 21:44:25

标签: android android-layout android-activity android-xml

我正在尝试构建一个像Facebook messenger for android一样的聊天单元格布局。我能够轻松复制这种布局。我为名称添加了一个maxLine参数,以防它真的很长,如果是这样的话会显示省略号。问题是如果这个人的名字真的很长,那么Ellipsis就不会出现,我的时间戳将是2个字符长,2个字符TextView that shows the timestamp。我也在使用CirceImageView库。

Build.graddle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.1'
    compile 'com.android.support:design:22.2.1'
    compile 'de.hdodenhof:circleimageview:1.3.0'
}

layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="72dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="8dp"
    android:paddingBottom="8dp">
    <de.hdodenhof.circleimageview.CircleImageView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/profile_image"
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:src="@drawable/bob"
        android:layout_marginRight="16dp"
        app:border_width="0dp"
        app:border_color="#FF000000"/>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_toStartOf="@id/lblMessageTime"
                android:text="Person name is lonnnnnnnnnnnnnng"
                android:id="@+id/person_name"
                android:textSize="15sp"
                android:textColor="#000000"
                android:layout_toLeftOf="@id/textTime"
                android:textStyle="bold"
                android:ellipsize="end"
                android:maxLines="1" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="8dp"
                android:text="23:00"
                android:layout_weight="1"
                android:layout_alignParentRight="true"
                android:layout_alignBaseline="@id/person_name"
                android:id="@+id/lblMessageTime"/>
        </LinearLayout>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/grayAddSessionButton"
            android:id="@+id/textMessage"
            android:text="This is a message"/>
    </LinearLayout>
</LinearLayout>

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果您想避免过度使用,则不应将RelativeLayout用作TextViews的容器,或者不要将wrap_content用于android:layout_width person_name {{ 1}}但是要使它固定宽度(即&#34; 200dp&#34;)或扩展TextView类,并使其不允许超出一定宽度的任何拉伸。

答案 1 :(得分:-1)

我找到了一种方便的方法。我删除了android:layout_weight =&#34; 1&#34;到了时间戳,我添加了android:layout_weight =&#34; .5&#34;到名称TextView。由于名称TextView是唯一具有权重并且低于1的名称,因此如果文本视图与时间戳(see image)重叠,则不会完全显示包含该名称的文本视图。

这是新代码:

<强> Layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="72dp"
    android:paddingLeft="16dp"
    android:paddingRight="16dp"
    android:paddingTop="8dp"
    android:paddingBottom="8dp">
    <de.hdodenhof.circleimageview.CircleImageView
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/profile_image"
        android:layout_width="56dp"
        android:layout_height="56dp"
        android:src="@drawable/bob"
        android:layout_marginRight="16dp"
        app:border_width="0dp"
        app:border_color="#FF000000"/>
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:text="This name is really long but it is cut"
                android:id="@+id/person_name"
                android:textSize="15sp"
                android:textColor="#000000"
                android:layout_toLeftOf="@id/textTime"
                android:textStyle="bold"
                android:ellipsize="end"
                android:layout_weight=".5"
                android:maxLines="1"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="8dp"
                android:text="23:00"
                android:layout_alignParentRight="true"
                android:id="@+id/lblMessageTime"/>
        </LinearLayout>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@color/grayAddSessionButton"
            android:id="@+id/textMessage"
            android:text="This is a message"/>
    </LinearLayout>
</LinearLayout>