Android. установить textSize так, чтобы его высота соответствовала проценту от высоты его родительских макетов - возможно?
Моя задача проста, но любое решение кажется очень сложным... У меня есть приложение, которое динамически генерирует 17 таблиц с textView/editText в каждой строке. Прямо сейчас textSize жестко задан в 20f для всех textViews/editText - он выглядит прилично на моем телефоне, но не очень совместим с fx. планшет. Я хочу установить размер текста на число, которое сделает высоту текста 1/17 его внешнего контейнера. каждая таблица будет идеально вписываться в экран независимо от размера / разрешения устройства.
Как это выглядит на разных размеров экрана - img
Как это должно выглядеть при разных размерах экрана - img
и неважно какой другой вид экрана; дюймы, размеры, разрешение и т. д. и т. д. высота текстовой строки ВСЕГДА должна составлять 1/17 от высоты красного поля. Это вообще возможно?
Я пишу на kotlin, и мой пользовательский интерфейс генерируется динамически, я создаю строки и текстовые представления следующим образом:
fun createRow(label: String, tf: Typeface): TableRow {
val row = TableRow(activity)
row.setBackgroundResource(R.drawable.border)
gameSheetTable.addView(row)
val tw = TextView(activity)
tw.text = label
tw.textSize = textSize
tw.typeface = tf
tw.setTextColor(Color.BLACK)
textViews.add(tw)
row.addView(tw)
return row
}
Я пытался:
использование разных значений для разных размеров экрана; hdpi, mdpi, xhdpi, xxhdpi, xxxhdpi - этот результат был очень уродливым и не работал вообще, 10-дюймовый планшет был распознан как большое устройство, но имел низкое разрешение, поэтому текст вышел из экрана, другие 10-дюймовые таблицы было хорошо так что этот метод совершенно бесполезен. право?
Я жестко закодировал textSize, чтобы он был очень маленьким, и сделал цикл, который увеличил бы его на единицу за каждый цикл. Проблема здесь в том, что textView не отображаются перед возвратом функции. Таким образом, условие цикла никогда не сможет проверить, соответствует ли новый textSize 1/17 высоты высоты внешних контейнеров. При отладке и переходе к параметру tw.textSize = newTextSize, который также должен увеличить высоту строки, но поскольку он не отображает, nh = nameRow.height остается тем же, поэтому цикл просто выполняется в бесконечности...
`
fun resizeText(){
val maxHeight = dgs_cointainer.height
var nh = nameRow.height
while(maxHeight > nh * 17){
textSize += 1
editTexts.forEach {
et -> et.textSize = textSize
}
textViews.forEach {
tw -> tw.textSize = textSize
}
nh = nameRow.height }
}
НЕ РАБОТАЛ
- (еще не пробовал), тогда есть этот "новый" Авторазмер TextView, но я не могу найти никаких примеров, чтобы настроить его на 1/17 высоты чего-то и настроить на него, и я немного запутался, если он будет работать на старых устройствах, поскольку он требует Android 8.0 API уровня 26??? - это может сделать то, что я пытаюсь?
1 ответ
Если родителем является LinearLayout, используйте weights и weightSum с высотой 0dp для TextView. Это заставит textView взять процент от родителя по весу / весу.
Если родителем является RelativeLayout, используйте вместо этого PercentRelativeLayout из библиотеки поддержки, в которой есть поддержка процентов.
Если родитель - это что-то отличное от этих двух, вам нужно посмотреть, что родитель поддерживает для вариантов макета.