Android текст обрезается на фиксированной высоте TextView

1

Рассмотрим этот макет:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="160dp"
    android:textSize="20sp"
    android:text="Apple Inc. is an American multinational technology company headquartered in Cupertino, California, that designs, develops, and sells consumer electronics, computer software, and online services."
    android:ellipsize="end"
    android:gravity="top"/>

Я хочу, чтобы TextView вычислял, сколько строк он может уместить в 160 dp, и помещает три точки, если места недостаточно. Однако вместо этого текст обрезается: Изображение 174551

Как я могу добиться вышеуказанного поведения? Я предполагаю, что могу сделать это, просто указав какой-либо атрибут в файле ресурсов макета. Благодарю.

Теги:
android-layout

1 ответ

1

Нет способа достичь этого, просто указав атрибуты в файле ресурсов макета.

Если вы посмотрите на метод setEllipsize() в TextView, вы увидите, что он говорит:

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

Из этой документации вы можете видеть, что многоточие в TextView на самом деле сильно зависит от двух факторов: ширины представления и количества строк.

Поэтому я вспоминаю, что многоточие может не отображаться для TextView если оно не знает максимального числа строк, которое может иметь ваше TextView.

Так что для вашего предполагаемого поведения это невозможно, потому что вместо этого вы зависите от высоты просмотра. Вы хотите использовать определенную высоту, а затем TextView рассчитать количество линий, которые могут быть показаны в пределах этой высоты. Наконец, если количество необходимых строк больше указанного количества, вы хотите показать эллипсы.

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

Поэтому, если вы хотите такое поведение, вам нужно:

  1. Создайте собственный TextView для вашей конкретной реализации эллипсов

  2. Вручную вычислите количество видимых строк, затем используйте setMaxLines() для этого TextView

Для второго варианта вы можете рассчитать это, используя методы TextView getHeight() и getLineHeight().

Например:

textview = (TextView) findViewById(R.id.exampleTextView);

textview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        final int maxLines = textview.getHeight() / textview.getLineHeight();
        textview.setMaxLines(maxLines);
    }
});

В моем примере я делаю это внутри ViewTreeObserver чтобы избежать getHeight() размером 0.

Второй вариант должен иметь возможность получить желаемое поведение, но если вы хотите это для каждого TextView, вам следует рассмотреть возможность создания пользовательского TextView.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню