Рассмотрим этот макет:
<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, и помещает три точки, если места недостаточно. Однако вместо этого текст обрезается:
Как я могу добиться вышеуказанного поведения? Я предполагаю, что могу сделать это, просто указав какой-либо атрибут в файле ресурсов макета. Благодарю.
Нет способа достичь этого, просто указав атрибуты в файле ресурсов макета.
Если вы посмотрите на метод setEllipsize()
в TextView
, вы увидите, что он говорит:
Приводит к тому, что слова в тексте, длина которых превышает ширину представления, будут иметь эллиптический размер вместо разбитых в середине. Вы также можете установить setSingleLine() или setHorizontallyScrolling (логическое значение), чтобы ограничить текст одной строкой. Используйте ноль, чтобы отключить многоточие. Если setMaxLines (int) использовалось для установки двух или более строк, поддерживаются только TextUtils.TruncateAt.END и TextUtils.TruncateAt.MARQUEE (другие типы многоточия не будут ничего делать).
Из этой документации вы можете видеть, что многоточие в TextView
на самом деле сильно зависит от двух факторов: ширины представления и количества строк.
Поэтому я вспоминаю, что многоточие может не отображаться для TextView
если оно не знает максимального числа строк, которое может иметь ваше TextView
.
Так что для вашего предполагаемого поведения это невозможно, потому что вместо этого вы зависите от высоты просмотра. Вы хотите использовать определенную высоту, а затем TextView рассчитать количество линий, которые могут быть показаны в пределах этой высоты. Наконец, если количество необходимых строк больше указанного количества, вы хотите показать эллипсы.
Это... невозможно при кодировании эллипсов в TextView
. Это просто не было предназначено для этого.
Поэтому, если вы хотите такое поведение, вам нужно:
Создайте собственный TextView
для вашей конкретной реализации эллипсов
Вручную вычислите количество видимых строк, затем используйте 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
.