Skip to content

Instantly share code, notes, and snippets.

@victory316
Last active January 26, 2023 05:29
Show Gist options
  • Save victory316/b10329e1f2113d823d32b3fc4eb850b5 to your computer and use it in GitHub Desktop.
Save victory316/b10329e1f2113d823d32b3fc4eb850b5 to your computer and use it in GitHub Desktop.
MaterialAlertDialog wrapper Extension function
fun Context.buildAlertDialog(
@StringRes title: Int? = null,
@StringRes message: Int? = null,
@StringRes setPositiveButton: Int? = null,
@StringRes setNegativeButton: Int? = null,
onPositiveSelected: (() -> Unit)? = null,
onNegativeSelected: (() -> Unit)? = null
): MaterialAlertDialogBuilder {
return MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
.apply {
title?.let { setTitle(title) }
message?.let { setMessage(message) }
setPositiveButton?.let {
setPositiveButton(setPositiveButton) { _, _ ->
onPositiveSelected?.invoke()
}
}
setNegativeButton?.let {
setNegativeButton(setNegativeButton) { _, _ ->
onNegativeSelected?.invoke()
}
}
}
}
fun Context.buildAlertWithMenuDialog(
@ArrayRes itemsId: Int,
onItemSelected: (selectedItemId: Int) -> Unit
): MaterialAlertDialogBuilder {
return MaterialAlertDialogBuilder(this, R.style.MaterialAlertDialogTheme)
.apply {
setItems(itemsId) { _, selected ->
onItemSelected.invoke(selected)
}
}
}
// Usage example in Activity or Fragment
private fun showExitAlert() {
buildAlertDialog(
title = R.string.title_exit,
message = R.string.message_exit,
setPositiveButton = R.string.confirm_exit,
onPositiveSelected = {
finishAffinity()
}
).show()
}
<style name="MaterialAlertDialogTheme" parent="MaterialAlertDialog.Material3">
<item name="android:textSize">14dp</item>
<item name="materialAlertDialogTitleTextStyle">@style/MaterialAlertDialogTitleStyle</item>
<item name="materialAlertDialogBodyTextStyle">@style/MaterialAlertDialogItemStyle</item>
<item name="buttonBarPositiveButtonStyle">@style/MaterialAlertDialogButtonStyle</item>
<item name="buttonBarNegativeButtonStyle">@style/MaterialAlertDialogButtonStyle</item>
</style>
<style name="MaterialAlertDialogTitleStyle" parent="MaterialAlertDialog.MaterialComponents.Title.Text">
<item name="android:textSize">24dp</item>
<item name="enforceMaterialTheme">true</item>
<item name="enforceTextAppearance">true</item>
<item name="android:textAppearance">?attr/textAppearanceHeadlineSmall</item>
<item name="android:textColor">@color/black</item>
</style>
<style name="MaterialAlertDialogItemStyle" parent="MaterialAlertDialog.Material3.Body.Text">
<item name="android:textColor">@color/black</item>
</style>
<style name="MaterialAlertDialogButtonStyle" parent="Widget.Material3.Button.TextButton.Dialog">
<item name="android:textSize">14dp</item>
<item name="enforceMaterialTheme">true</item>
<item name="enforceTextAppearance">true</item>
<item name="android:textAppearance">?attr/textAppearanceButton</item>
<item name="android:textColor">@color/colorAccent</item>
</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment