MainActivity.kt
package com.cfsuman.kotlintutorials
import android.os.Bundle
import android.widget.*
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import com.google.android.material.dialog.MaterialAlertDialogBuilder
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val context:MainActivity = this
// get the widgets reference from XML layout
val button = findViewById<Button>(R.id.button)
val textView = findViewById<TextView>(R.id.textView)
// initial checked items
val initialCheckedItems = mutableListOf<Boolean>()
button.setOnClickListener {
val builder = MaterialAlertDialogBuilder(context)
// dialog title
builder.setTitle("Select favorite colors (min 2)")
val colors = arrayOf(
"African violet",
"Alice blue",
"Alloy orange",
"Android green",
"Amaranth pink",
"Antique bronze"
)
if (initialCheckedItems.isEmpty()){
repeat(colors.count()) {initialCheckedItems.add(false)}
}
builder.setMultiChoiceItems(
colors,
initialCheckedItems.toBooleanArray()
) { dialog, which, isChecked ->}
// alert dialog positive button
builder.setPositiveButton("Submit"){dialog,which->
val alertDialog = dialog as AlertDialog
val sparseBooleanArray = alertDialog
.listView.checkedItemPositions
var counter = 0
textView.text = ""
colors.forEachIndexed { index, s ->
if (sparseBooleanArray.get(index, false)) {
textView.append("\n$s")
counter += 1
}
}
if (counter > 0) {
textView.text = "Selected colors: " + textView.text
}
}
// alert dialog neutral button
builder.setNeutralButton("Cancel"){dialog,which->
textView.text = ""
}
// set dialog non cancelable
builder.setCancelable(false)
// finally, create the alert dialog and show it
val dialog = builder.create()
dialog.show()
// initially enable disable the positive button
if((initialCheckedItems.filter { it }).size < 2){
dialog.getButton(
AlertDialog.BUTTON_POSITIVE).isEnabled = false
}
// dialog list item click listener
dialog.listView.onItemClickListener =
AdapterView.OnItemClickListener {
parent, view, position, id ->
val sparseBooleanArray = dialog.listView
.checkedItemPositions
var checkedItems = 0
colors.forEachIndexed { index, s ->
if (sparseBooleanArray.get(index,false)){
checkedItems +=1
initialCheckedItems[index] = true
}else{
initialCheckedItems[index] = false
}
}
dialog.getButton(AlertDialog.BUTTON_POSITIVE)
.isEnabled = checkedItems >=2
}
}
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#DCDCDC"
android:padding="24dp">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Show Dialog"
android:textAllCaps="false"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:fontFamily="sans-serif"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/button" />
</androidx.constraintlayout.widget.ConstraintLayout>
build.gradle dependencies[add]
// Material components
implementation 'com.google.android.material:material:1.6.1'



- kotlin ktx - MaskFilterSpan blur
- kotlin ktx - IconMarginSpan
- kotlin ktx - Scale bitmap
- kotlin ktx - Scale bitmap keep aspect ratio
- kotlin ktx - Drawable to bitmap
- kotlin syntax - String Drop DropLast DropWhile DropLastWhile
- kotlin - AlertDialog title text color size bold programmatically
- kotlin - AlertDialog title align center programmatically
- kotlin - AlertDialog EditText programmatically
- kotlin - AlertDialog single choice items