【问题标题】:ellipsize not working with Textviewellipsize 不适用于 Textview
【发布时间】:2016-10-06 08:06:26
【问题描述】:

这两个作品

 <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 end 和 maxlines 时它会起作用,但当我有 ellipsize middle 和 maxlines 时却不行。以及为什么它适用于单线以及椭圆中间而不是 maxlines?谢谢你的帮助。我需要 ellipsize middle 和 maxlines 3。

【问题讨论】:

  • 你试过 maxlines = 1 和 ellipsize : middle 看看它是否是多行文本和仅中间的问题?
  • maxlines=1 工作正常,就像 singleline=true (elippsize=middle)
  • 但我需要我的 maxlines=3 。为什么适用于 1 而不是 3?
  • 在 maxlines 3 和 ellipsize 中间它只截断最后一个单词?还是什么都没有?

标签: android textview


【解决方案1】:

这是来自 TextView 文档的信息

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

导致文本中长于视图宽度的单词 椭圆形而不是在中间折断。您可能还想 setSingleLine() 或 setHorizo​​ntallyScrolling(boolean) 来约束 文本到单行。使用 null 关闭省略号。 如果 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." />

结果:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      这是一个很好的句子。 -> 这是一个.. 句子。

      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;
      }
      

      注意:在某些情况下,它也可能会删掉第一句话并使其像; “.. 句子”。需要改进。

      【讨论】:

        猜你喜欢
        • 2010-11-28
        • 2016-12-20
        • 1970-01-01
        • 2012-06-30
        • 2014-03-14
        • 2013-01-19
        • 1970-01-01
        • 2020-11-19
        • 2021-05-22
        相关资源
        最近更新 更多