自动截断TextView文本,以便不与另一个TextView重叠

时间:2012-05-03 20:26:54

标签: android xml android-layout

我有ListView,显示了一堆家庭作业。 ListView项使用FrameLayout定位两个TextViews。第一个TextView与左侧对齐,第二个与右侧对齐。 (两者在垂直方向上对齐。)第一个显示分配描述的片段,第二个显示截止日期。

我想要做的是使截止日期占用所需的空间,描述填满剩余空间,如下所示:

| ---------------------------------------------- ------ |
|阅读第15-35页,更新时间...周五,5月4日|
| ------------------------------------------------- --- |

现在说明文字将继续与日期重叠。它会在行尾截断。

无论如何我可以在XML中执行此操作,或者在设置TextView值之前缩短字符串是否必须在代码中执行此操作(可能在我的getView调用中)?如果我在代码中完成它,我必须计算字符串将占用的水平空间量,以确定描述需要多短。这似乎可能会变得混乱......

非常感谢有关如何实现这一目标的任何其他建议!

4 个答案:

答案 0 :(得分:10)

尝试使用ellipsize属性,如:

<TextView android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:ellipsize="end"
      android:singleLine="true"/>

请注意,Android或至少某些版本需要“ellipsize”和“singleline”属性,以便系统实际执行截断并添加省略号。

答案 1 :(得分:7)

而不是FrameLayout,这是与Ellipsize结合使用LinearLayout或RelativeLayout的理想之地:

<LinearLayout
  android:orientation="horizontal"
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >

  <TextView
    ...
    android:width="0dp"
    android:height="wrap_content"
    android:layout_weight="1" 
    android:ellipsize="end" />

  <TextView
    ...
    android:width="wrap_content"
    android:height="wrap_content"
    android:layout_weight="0" />

</LinearLayout>

或者替代

<RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content" >

  <TextView
    ...
    android:id="@+id/secondTV"
    android:width="wrap_content"
    android:height="wrap_content"
    android:layout_weight="0" />

  <TextView
    ...
    android:width="0dp"
    android:height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_toLeftOf="@id/secondTV" 
    android:ellipsize="end"/>

</RelativeLayout>

答案 2 :(得分:1)

将FrameLayout更改为LinearLayout或RelativeLayout。

  • LinearLayout:将截止日期宽度“wrap_content”和描述宽度设为0dp,然后将layout_weight =“1”添加到描述中

  • RelativeLayout:首先使用width wrap_content布局截止日期,然后使用规则布局描述,该规则应该在截止日期的左侧。

答案 3 :(得分:1)

Anton和JRaymond都非常关注(JRaymond帮我解决了他的例子)。这就是我想出的:

<RelativeLayout android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <TextView android:id="@+id/due_date"
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:layout_alignParentRight="true"
            android:singleLine="true" />

        <TextView android:id="@+id/description"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_alignParentLeft="true"
            android:layout_toLeftOf="@id/due_date"
            android:singleLine="true" />
</RelativeLayout>

(我需要首先声明我的截止日期标签,以便我可以在说明中引用它。我也意识到android:ellipsize似乎是可选的 - 我猜它默认为“结束”。)

非常感谢!