Android текст обрезается на фиксированной высоте TextView - PullRequest
1 голос
/ 26 марта 2019

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

<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 и помещает три точки, если места недостаточно.Однако вместо этого текст обрезается: enter image description here

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

1 Ответ

1 голос
/ 26 марта 2019

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

Если вы посмотрите на метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...