Dialog的自定义布局-内容体多行按钮显示不全问题

场景:dialog弹框-title、msg、btn
问题:dialog弹框部分测试机型上,底部btn展示不全,像被截断展示

描述:一个Dialog的自定义布局的根布局(LinearLayout)宽度match_parent,高度wrap_content,国际化时,发现多行内容会导致底部控价显示不全(部分机型),高度没有自适应,像是固定高度,被挤扁,其中内容区域一个TextView,因支持国际话可能有多行展示,Textview下方还有一个ConstraintLayout(里面有一行按钮)内容区域TextView高度wrap_content,当内容区域内容展示多行时,下方的ConstraintLayout里的控件被截断只展示了一部分。

  • 出现此问题机型:小米、三星(9.0系统-分辨率3040*1440)等手机
  • 问题原因分析:
    可能和View自身测量计算高度机制有关,内容区域Textview高度wrap_content时,默认按照其一行的高度计算,底部ConstraintLayout给的是固定的高度(50dp),dialog高度:一行内容体高度 + 50dp,
    此时内容区域展示的内容多行时,dialog底部btn就会被挤出dialog高度,就会出现dialog底部内容展示不全问题,解决方案有多种,以下给出两种:
  1. 不优雅方案:布局文件中内容TextView设置指定行数和最大行数,虽然展示不那么优雅但是也能解决90%的情况,毕竟也不是很多有多行文本的dialog,如果多的话,可以尝试中间内容区域给一个可滑动的文本控件设置默认高度(一开始给定具体的高度数值)
    例如:最多展示三行,默认一开始就支持三行内容的高度,布局不那么美观,超过三行末尾省略号(...)显示
android:ellipsize="end"
android:lines="3"
android:maxLines="3"
  1. 比较完美方案:setContentView之前,重新设置LayoutParams和View的其它属性值,在获取View后,根据属性值的设定重新计算布局高宽并绘制
val pas = LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT
        )
val view = LayoutInflater.from(context).inflate(R.layout.dialog_common_hint, null, false)
pas.setMargins(ScreenUtil.dp2px(45f).toInt(), 0, ScreenUtil.dp2px(45f).toInt(), 0)
view.layoutParams = pas
  1. 如果你使用三方适配方案(例如:AutoSize),设置的基准适配的参数 按照设计图尺寸(建议) 如果不想改动,也可以单独在弹框出现的页面进行动态设置(不建议使用),重新绘制页面:AutoSize.autoConvertDensity(this,尺寸,false)

你可能感兴趣的:(Dialog的自定义布局-内容体多行按钮显示不全问题)