Android系统。 设置textSize所以它的高度匹配它的父布局高度的百分比 – 可能吗?

我的任务很简单,但任何解决方案似乎非常复杂…我有一个应用程序,动态生成每行textView / editText 17表。 现在textSize被硬编码为20f所有textViews / editText – 它看起来不错,在我的手机,但它不是很兼容的FX。 平板电脑。 我想将文本大小设置为一个数字,它将使外部容器的文本的高度为1/17。 无论设备具有多大的尺寸/分辨率,每个tableRow都可以完美地适应屏幕。

它如何看起来不同的scrren大小 – img

它应该如何看起来不同的尺寸 – img

而不管别的什么样的屏幕; 英寸,尺寸,分辨率等等,文本行高总应该是红框高度的1/17。 这甚至有可能吗?

我写在kotlin和我的用户界面是动态生成的,我创建像这样的行和textViews:

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 } 

我努力了:

  1. 对不同的屏幕尺寸使用不同的值; hdpi,mdpi,xhdpi,xxhdpi,xxxhdpi – 这个结果非常难看,根本不起作用,10“平板电脑被认为是一个大的设备,但分辨率差,所以文本走出屏幕,其他10”表还好。 所以这个方法是完全没用的。 对?

  2. 我将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 } } 

不工作

  1. (还没有尝试),那么这是“新的”自动调整TextView,但我找不到任何示例将它配置为高度的1/17和autosize,以及我有点困惑,如果它将工作在较旧的设备,因为它声明要求Android 8.0 API级别26 – 这可以做我想要的吗?

如果父级是LinearLayout,则使用TextView的0dp高度的权重和weightSum。 这将使textView的重量/权重的父母的百分比。

如果父级是RelativeLayout,则使用支持库中的PercentRelativeLayout,而不是支持百分比。

如果父母不是这两个人,你将不得不看父母支持布局选项。

Interesting Posts