Как узнать размер текста, который поместится в 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 шт):

Автор решения: Vladimir Shal'kov

С учётом всех вводных, решить данную проблему можно поразному. чтобы выбрать наиболее подходящий вариант, нужно больше информации о проблеме.

Вариант 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")
                }
            }
        }
    }
}
→ Ссылка