«Слушатель OnDrawListener нельзя добавить или удалить из этого метода». Это в документации , и, исходя из вашего опыта, причиной может быть какое-то состояние гонки , но я не знаю подробностей.
Обходной путьЯ обнаружил следующее: создайте GlobalLayoutListener и удалите там onDrawListener. Будьте осторожны, потому что GlobalLayoutListner будет вызываться до и после onDraw много раз. Вот мой код (который не идеален, потому что GlobalLayoutListener будет вызываться пару раз после того, как для isDescriptionListenerAdded установлено значение false из-за разных потоков, но это не критично. Не стесняйтесь улучшать его.)
private var isDescriptionListenerAdded = false
fun setText(title: String, description: String, note: String) {
titleText.text = title
descriptionText.text = description
var descriptionDrawListener = ViewTreeObserver.OnDrawListener {
val maxLines = descriptionText.height / descriptionText.lineHeight
descriptionText.maxLines = maxLines
isDescriptionListenerAdded = true
}
descriptionText.viewTreeObserver.addOnDrawListener(descriptionDrawListener)
descriptionText.viewTreeObserver.addOnGlobalLayoutListener {
if (isDescriptionListenerAdded) {
isDescriptionListenerAdded = false
descriptionText.viewTreeObserver.removeOnDrawListener(descriptionDrawListener)
}
}
}
Как видите, после того, как текст задан, он вычисляет, сколько строк можно отобразить целиком, и устанавливает для maxLines это значение. После того, как это будет сделано, isDescriptionListenerAdded имеет значение true, поэтому в GlobalLayoutListener он будет удален, а для него установлено значение false, поэтому он больше никогда не запустится.