首页 > 解决方案 > 如何在Android中为按钮MaterialAlertDialog设置边距?

问题描述

我在我的项目中使用 MaterialAlertDialog,如何在标题/消息和按钮之间添加一些空间?

在此处输入图像描述

<style name="MaterialAlertDialog" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">        
        <item name="buttonBarPositiveButtonStyle">@style/CustomDialogButton</item>
        <item name="buttonBarNegativeButtonStyle">@style/CustomDialogButton</item>
        <item name="buttonBarNeutralButtonStyle">@style/CustomDialogButton</item>    
    </style>

<style name="CustomDialogButton" parent="Widget.MaterialComponents.Button.TextButton.Dialog">
    <item name="android:layout_marginTop">32dp</item>
    <item name="android:textColor">?uikitV2ColorTextQuaternary</item>
    <item name="textAllCaps">false</item>
</style>

当我尝试以样式或以编程方式设置边距时,它不起作用: 在此处输入图像描述

更新。

通过使用自定义视图创建自定义对话框构建器解决了这个问题,请参见代码:

class CustomMaterialDialogBuilder(context: Context) : MaterialAlertDialogBuilder(context) {

    private var title: CharSequence? = null
    private var message: CharSequence? = null

    override fun setMessage(messageId: Int): MaterialAlertDialogBuilder {
        return setMessage(context.getString(messageId))
    }

    override fun setMessage(message: CharSequence?): MaterialAlertDialogBuilder {
        this.message = message
        return this
    }

    override fun setTitle(titleId: Int): MaterialAlertDialogBuilder {
        return setTitle(context.getString(titleId))
    }

    override fun setTitle(title: CharSequence?): MaterialAlertDialogBuilder {
        this.title = title
        return this
    }

    override fun create(): AlertDialog {
        val view = LayoutInflater.from(context)
            .inflate(R.layout.layout_material_alert_dialog_content, null)
        view.findViewById<TextView>(R.id.title).setTextAndVisibility(title)
        view.findViewById<TextView>(R.id.message).setTextAndVisibility(message)
        this.setView(view)
        return super.create()
    }

    private fun TextView.setTextAndVisibility(value: CharSequence?) {
        if (!TextUtils.isEmpty(value)) {
            text = value
            visibility = View.VISIBLE
        }
    }
}

标签: android

解决方案


我建议您制作自定义 MaterialAlertDialog。为此,您必须创建一个 xml 布局文件并将其设置为构建器:

with (activity) {
        MaterialAlertDialogBuilder(this).create().apply { 
            setView(this.layoutInflater.inflate(R.layout.custom_dialog, this.root_container, false))
            show()
        }
 }

推荐阅读