ellipsize无法使用Textview

时间:2016-10-06 08:06:26

标签: android textview

这2个作品

 <TextView
    android:id="@+id/item2"
    android:layout_below="@id/item1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="middle"
    android:singleLine="true"
    android:paddingLeft="10dp"
    android:paddingRight="120dp"
    android:paddingTop="5dp" />

  <TextView
    android:id="@+id/item2"
    android:layout_below="@id/item1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="end"
    android:maxLines="3"
    android:paddingLeft="10dp"
    android:paddingRight="120dp"
    android:paddingTop="5dp" />

这不起作用

  <TextView
    android:id="@+id/item2"
    android:layout_below="@id/item1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ellipsize="middle"
    android:maxLines="3"
    android:paddingLeft="10dp"
    android:paddingRight="120dp"
    android:paddingTop="5dp" />

那么,解决方案是什么?为什么会出现这样的不合理?当我有椭圆化结束和最大线时,为什么它可以工作,但是当我有椭圆化中间线和最大线时。为什么它适用于单线以及椭圆形中间而不是最大线?谢谢你的帮助。我需要ellipsize middle和maxlines 3.

3 个答案:

答案 0 :(得分:4)

以下是TextView文档中的信息

  

public void setEllipsize(TextUtils.TruncateAt where)
在API中添加   1级

     

导致文本中长于视图宽度的单词   椭圆化而不是在中间破碎。你可能也想   setSingleLine()或setHorizo​​ntallyScrolling(boolean)来约束   文字到一行。使用null关闭ellipsizing。 如果   setMaxLines(int)用于设置两行或更多行,只有END和   支持MARQUEE (其他椭圆化类型不会做任何事情)。

然而,我为多线制作了非常简单的ellipsize =“middle”。当然它应该在空闲时间进行更多升级,但现在就是。

这是要粘贴到包

的根目录的小部件类
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

public class MiddleMultilineTextView extends TextView {

    private String SYMBOL = " ... ";
    private final int SYMBOL_LENGTH = SYMBOL.length();

    public MiddleMultilineTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        if (getMaxLines() > 1) {
            int originalLength = getText().length();
            int visibleLength = getVisibleLength();

            if (originalLength > visibleLength) {
                setText(smartTrim(getText().toString(), visibleLength - SYMBOL_LENGTH));
            }
        }
    }

    private String smartTrim(String string, int maxLength) {
        if (string == null)
            return null;
        if (maxLength < 1)
            return string;
        if (string.length() <= maxLength)
            return string;
        if (maxLength == 1)
            return string.substring(0, 1) + "...";

        int midpoint = (int) Math.ceil(string.length() / 2);
        int toremove = string.length() - maxLength;
        int lstrip = (int) Math.ceil(toremove / 2);
        int rstrip = toremove - lstrip;

        String result = string.substring(0, midpoint - lstrip) + SYMBOL + string.substring(midpoint + rstrip);
        return result;
    }

    private int getVisibleLength() {
        int start = getLayout().getLineStart(0);
        int end = getLayout().getLineEnd(getMaxLines() - 1);
        return getText().toString().substring(start, end).length();
    }
}

这是在布局中使用的自定义小部件:

<com.example.middlemultiline.MiddleMultilineTextView
        android:id="@+id/item2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="middle"
        android:maxLines="4"
        android:text="Months earlier, in May 2007, a typically busy time for construction work, he sat home for two weeks without any jobs lined up, the first time that had ever happened in all the years he’d been an independent contractor. It was an early indication that hard times were ahead. By fall, he tried to find a steady job with a construction company but by then no one was hiring. And now he no longer had the extra income to support his wife’s entrepreneurial effort — a coffee vending machine business — so that went under too." />

结果:

preview

代码基于:
https://stackoverflow.com/a/8798989/619673
https://stackoverflow.com/a/831583/619673

答案 1 :(得分:0)

实际上android:ellipsize="end"本身就意味着你有一个elip工作的内容,所以必须使用android:singleLine="true" 请参阅文档here

答案 2 :(得分:0)

我还针对 @deadfish 回答制作了自定义TextView。如果你不想丢失你的话,你可以使用它;如果它不适合该行,它将删除句子中最后一个单词的前一个单词。等;

  

这句话很好。 - &GT;这是一个......句子。

private String smartTrim__word_cut(String input,int visible){
    int visibleLength = visible;
    int textSize = input.length();//input.length();
    Boolean hasDot = false;
    String visibleText = "";

    while(textSize > visibleLength)
    {
        // To ArrayList
        List<String> l2 = new ArrayList<>(Arrays.asList(input.split(" ")));

        if(!hasDot){
            l2.set(l2.size()-2, "..");
            hasDot = true;
        }
        else{
            l2.remove(l2.size()-3);
        }

        StringBuilder listString = new StringBuilder();
        for (String s : l2){
            listString.append(s+" ");
        }
        visibleText = listString.toString().trim();
        textSize = visibleText.length();
        input = visibleText;
    }
    return visibleText;
}
  

注意:在某些情况下,它也可能会删除第一句话并使其成为; &#34; ..句子&#34;。需要改进。

相关问题