2016-10-06 4 views
2

Этот 2 работаетellipsize не работает с TextView

<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" /> 

Итак, что такое soluton. и почему такая несогласованность? Почему это работает, когда у меня есть эллипсис конца и maxlines, но не тогда, когда у меня есть эллипсис средних и максимальных линий. И почему он работает с одинарной линией, а также с эллипсисом, а не с максимальными линиями? Спасибо за помощь. Мне нужно ellipsize среднего и MaxLines 3.

+0

Пробовали ли вы MAXLINES = 1 с ellipsize: посередине, чтобы увидеть, если это проблема с многострочным текстом и только посередине? –

+0

maxlines = 1 работает так же, как singleline = true (elippsize = middle) –

+0

, но мне нужны мои maxlines = 3. почему работает на 1, а не на 3? –

ответ

2

Вот информация из документации TextView

общественный недействительный setEllipsize (TextUtils.TruncateAt где)
Добавлена ​​в API уровня 1

Причина слова в тексте, длиннее, чем вид, является широким, чтобы быть эллипсисом вместо разбитого посередине. Вы также можете указать setSingleLine() или setHorizontallyScrolling (boolean), чтобы ограничить текст одной строкой. Используйте null, чтобы отключить эллипсирование. Если setMaxLines (int) используется для установки двух или более строк, поддерживаются только END и MARQUEE (другие типы эллипсинга ничего не сделают).


Однако я сделал очень простой ellipsize = "средний" для многострочных. Конечно, он должен быть повышен в свободное время, но вот он.

Это класс виджета, чтобы вставить в корень пакета

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

0

android:ellipsize="end" На самом деле само по себе означает, что у вас есть содержание с Элип, работающих на конце так должны использовать android:singleLine="true" См документации here

Смежные вопросы