如果textView所在的行太长,则包装文本块

时间:2015-01-16 17:54:18

标签: android xml android-layout layout

我正在寻找满足此要求的最佳方式。如果在其他地方得到解答,我道歉,我找不到解决方案似乎是一个简单的问题。

列表中有一行文字如下所示:

项目标题 - (5项)

如果项目的标题太长,那么它会包装,这是预期的。但是,它不应该在“5”和“项目”之间进行换行。如果它需要换行,那么整个“(5项)”应该换行到下一行。标题的文字应该是椭圆形的。

我似乎无法找到一种方法来创建适用于此的布局。

4 个答案:

答案 0 :(得分:1)

This可能有所帮助。您可以使用android:ellipsize属性定义文本的哪个部分将被截断。

在您的情况下,根据链接的答案,我会使用android:ellipsize="middle"android:ellipsize="marquee",这样可以阅读文字幻灯片。

虽然这实际上没有满足您的要求(项目数量自动转到第二行),但我认为这可能是一个更好的解决方案。

查看官方信息here


我想到的另一件事是使用两个不同的TextView,一个用于标题,另一个用于右对齐?用于项目计数。我会将android:ellipsize="end"提供给第一个,android:layout_width="wrap_content"提供给后者。


此外,你可以在标题下面找一个计数TextView,如果有足够的空间,它会被附加到标题上。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/container"
    android:orientation="vertical" >

    <TextView android:id="@+id/text1"
        android:text="a very very very long title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ellipsize="end" />


    <TextView android:id="@+id/text2"
        android:text="(5 items)"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</LinearLayout>

在您的代码中,您可以检查宽度:

View container = findViewById(R.id.container);
TextView tv1 = (TextView) findViewById(R.id.text1);
TextView tv2 = (TextView) findViewById(R.id.text2);


String HEADER = tv1.getText();
String COUNT = tv2.getText();

int widthHeader = tv1.getWidth();
int widthCount = tv1.getWidth();
int widthAvailable = container.getWidth();

if (widthAvailable - widthHeader > widthCount) {
    tv1.setText(HEADER + " - " + COUNT);
    tv2.setText("");
}

答案 1 :(得分:1)

TextUtils类具有名为ellipsize

的方法
  

public static CharSequence ellipsize(CharSequence text,TextPaint p,float avail,TextUtils.TruncateAt where)   在API级别1中添加

     

如果原始文本在给定指定Paint的属性的情况下适合指定宽度,则返回原始文本;如果不适合,则返回在指定边缘或中心添加了省略号字符的截断副本。

以下是我们如何使用它。让我们假设“项目标题 - (5项)”是fullText,(5项)是后缀,textView是包含文本的文本视图。

String ellipsizedText = TextUtils.ellipsize(fullText, textView.getPaint(), fullTexViewtWidth ,TextUtils.TruncateAt.END);

现在,文本将被椭圆化,或者不会。我们可以通过检查ellipsizedText中是否存在后缀来检查这一点。 如果它是椭圆化的(后缀被删除),我们应该再次调用ellipsize函数,但这次减小了宽度,因为我们想为后缀字符串保留一个空格并删除后缀,因为我们单独添加它。所以,新的电话将是

ellipsizedText = TextUtils.ellipsize(removedSuffixText, textView.getPaint(), reducedWidth ,TextUtils.TruncateAt.END);

最后我们将textView的文本设置为ellipsizedText+suffix;

我们需要找出的值很少

  1. fullTexViewtWidth - 这可能很棘手,因为我们没有为文本视图指定特定的宽度。假设我们将宽度设置为匹配父级,那么我们可以通过视图树观察器来实现它。按照here
  2. 的答案
  3. reducedWidth - 这更加棘手。为了计算这个,我们需要找到后缀占用的宽度,并从fullTexViewtWidth中减去它。 This answer解释了如何找到后缀占用的宽度

    final float densityMultiplier = getContext().getResources().getDisplayMetrics().density; final float scaledPx = 20 * densityMultiplier; paint.setTextSize(scaledPx); final float size = paint.measureText("sample text");

  4. 我担心这只有在maxLines为1且textView的宽度设置为matchparent时才有效。

答案 2 :(得分:0)

我能从你的问题中理解的是

1) It does not matter how long the title text is,it can wrap according to its length.

2) Your text "(5 items)" should not break, it should stays together. What ever
   is the length of your TITLE.

如果超过2分是正确的。那么简单的解决方案就是这个

 Just replace your String "(5 items)"

 String "(5&#160;items)"

注意:

Here, '&#160' is character code of 'SPACE'. This bind's your string as one 
String and stays together.

希望这可以解决您的问题。

答案 3 :(得分:0)

您是否尝试过使用两个textView的相对布局,一个用于标题,另一个用于“标签”?使用左侧的相对布局:

<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/container" >

<TextView android:id="@+id/text1"
    android:text="a very very very long title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:toLeftOf="@+id/label" />


<TextView android:id="@+id/label"
    android:text="(5 items)"
    android:singleLine="true"
    android:layout_alignParentRight="true" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

你也可以使用linearLayout权重这将使文本总是适合一个比例(标题为80%,本例中标签为20%):

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:weight_sum="100"
android:orientation="horizontal"
android:id="@+id/container" >

<TextView android:id="@+id/text1"
    android:weight="80"
    android:text="a very very very long title"
    android:layout_width="0dp"
    android:layout_height="wrap_content" />


<TextView android:id="@+id/label"
    android:text="(5 items)"
    android:singleLine="true"
    android:weight="20"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

</LinearLayout>