Эллипсизация не работает должным образом для многострочного TextView с произвольной максимальной высотой

У меня есть TextView с неизвестной максимальной высотой, которая зависит от разрешения DPI / экрана устройства. Так, например, на устройстве и в MDPI эта максимальная высота позволяет показывать только по 2 строки за раз, что может быть увеличено до неопределенного числа.

Моя проблема связана с функциональностью эллипсиса. Предположим, что определенное устройство позволяет отображать 4 строки. Если я вручную установил максимальное количество строк, например …

 <TextView android:id="@+id/some_id" android:layout_width="fill_parent" android:layout_height="0dip" android:ellipsize="end" android:maxLines="4" android:singleLine="false" android:layout_weight="1" android:gravity="center_vertical" android:text="This is some really really really really really long text" android:textSize="15sp" /> 

… все работает нормально. Если текст не подходит должным образом, то в конце четвертой строки добавляется многоточие, например:

 This is some really really really really really long... 

Но я бы предпочел не устанавливать количество строк как статическую переменную, так как я бы предпочел включить поддержку любой комбинации разрешения DPI / экрана. Поэтому, если я maxLines эллипсис больше не отображается правильно в строке 4, отображая вместо этого неполную часть текста:

 This is some really really really really really long 

Если я немного увеличиваю размер TextView , я вижу, что остальная часть текста по-прежнему рисуется «позади» других Views . Установка переменной maxHeight тоже не работает.

Я действительно не могу найти решение этой проблемы. Есть идеи? Если это помогает, я работаю только с Android v4.0.3 и выше (API-уровень 15).

Solutions Collecting From Web of "Эллипсизация не работает должным образом для многострочного TextView с произвольной максимальной высотой"

Вычислите, сколько строк вписывается в TextView с TextView#getHeight() и TextView#getLineHeight() . Затем вызовите TextView#setMaxLines() .

 ViewTreeObserver observer = textView.getViewTreeObserver(); observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { int maxLines = (int) textView.getHeight() / textView.getLineHeight(); textView.setMaxLines(maxLines); textView.getViewTreeObserver().removeGlobalOnLayoutListener( this); } });