android - 如何在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
}
}
}
解决方案
我建议您制作自定义 MaterialAlertDialog。为此,您必须创建一个 xml 布局文件并将其设置为构建器:
with (activity) {
MaterialAlertDialogBuilder(this).create().apply {
setView(this.layoutInflater.inflate(R.layout.custom_dialog, this.root_container, false))
show()
}
}