Android系统。设置textSize以使其高度与其父级布局高度的百分比匹配 - 可能吗?

时间:2017-09-20 15:37:07

标签: android kotlin autoresize screen-size text-size

我的任务很简单,但任何解决方案看起来都很复杂......我有一个应用程序可以动态生成17个表格,每行有一个textView / editText。现在textSize被硬编码为所有textViews / editText的20f - 它在我的手机上看起来不错,但它与fx不太兼容。平板电脑。我想将textsize设置为一个数字,该数字将使文本的高度为其外部容器的1/17。无论设备具有什么尺寸/分辨率,每个tableRow都将完美地适合屏幕。

How it looks on different scrren sizes - img

How it should looks on different scrren sizes - img

并且无论其他什么样的屏幕;英寸,尺寸,分辨率等。文本行高度应始终为红色框的高度的1/17。这甚至可能吗?

我在kotlin写作,我的UI是动态生成的,我创建行和& 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仍然是相同的所以循环只是在无限远...

  3. `

    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并自动调整大小,如果它可以在旧设备上运行,我会感到困惑,因为它声明需要android 8.0 API级别26 ??? - 这可以做我正在尝试的吗?

1 个答案:

答案 0 :(得分:0)

如果父级是LinearLayout,则对TextView使用权重和weightSum,高度为0dp。这将使textView占父项的一定百分比/权重。

如果父级是RelativeLayout,请使用支持库中的PercentRelativeLayout,它支持百分比。

如果父母不是那两个,那么你必须看看父母对布局选项的支持。