Как узнать размер текста, который поместится в TextView (по высоте)?
Стоит задача отображения текста на карточке. Текст я помещаю в TextView. Так как текст случайного размера, он не всегда отображается полностью(по высоте). Есть ли способ определить максимальный размер видимого текста в TextView, что бы можно было разбить его на части, для отображения на новой карточке.
Если такого способа нет, какие есть варианты решения данной проблемы ?
Разметка карточки с текстом
<androidx.cardview.widget.CardView
android:id="@+id/card_main_text"
android:layout_width="wrap_content"
android:layout_height="600dp"
android:layout_margin="20dp"
app:cardCornerRadius="10dp"
app:cardElevation="6dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/first_separator">
<TextView
android:id="@+id/main_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="10dp"
android:textSize="16sp" />
</androidx.cardview.widget.CardView>
Ответы (1 шт):
С учётом всех вводных, решить данную проблему можно поразному. чтобы выбрать наиболее подходящий вариант, нужно больше информации о проблеме.
Вариант 1.
Убрать фиксированную высоту у CardView, android:layout_height="600dp"
, сделать её android:layout_height="wrap_content"
и тогда карточка будет расширятся, в зависимости от того, какой размер текста.
Вариант 2. Можно ограничить кол-во строк в TextView, например до 3х, с помощью атрибута: android:maxLines="3"
, а так же добавить атрибут android:ellipsize="end"
, который будет добавлять многоточие в конце, если текст не будет влезать в 3 строки.
Вариант 3. Можно узнать размеры TextView, после того, как текст в неё был добавлен и понять, весь он влез или нет. Делается это с помощью метода .doOnLayout
Вот пример кода с комментариями, который возвращает строку, которая не влезла в CardView:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val cardView = findViewById<CardView>(R.id.card_main_text)
val textView = findViewById<TextView>(R.id.main_text)
textView.text = "Тут должна быть очень длинная строка"
// Используем doOnLayout для проверки, помещается ли текст в одну строку
cardView.doOnLayout {
textView.doOnLayout {
// Получаем высоту TextView
val textViewHeight = textView.height
// Получаем высоту текста внутри TextView
val layout = textView.layout
val textHeight = layout.height
// Сравниваем высоту текста с высотой TextView
if (textHeight > textViewHeight) {
Log.d("TEXT_TEST", "Текст не помещается в TextView")
val lastVisibleLine = layout.getLineForVertical(textViewHeight)
val endOfLastVisibleLine = layout.getLineEnd(lastVisibleLine)
val remainingText = textView.text.substring(endOfLastVisibleLine)
Log.d("TEXT_TEST", "Строка, которая не влезла: $remainingText")
} else {
Log.d("TEXT_TEST","Текст помещается в TextView")
}
}
}
}
}