android - Material button example

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rootLayout"
        tools:context=".MainActivity">

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Material Default Button"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"
            android:id="@+id/materialButton"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Outline Button"
            style="@style/Widget.MaterialComponents.Button.OutlinedButton"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp"
            android:id="@+id/materialButton2"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Text Button"
            style="@style/Widget.MaterialComponents.Button.TextButton"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton2"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"
            android:id="@+id/materialButton3"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Unelevated Button"
            style="@style/Widget.MaterialComponents.Button.UnelevatedButton"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton3"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginEnd="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginStart="8dp"
            android:id="@+id/materialButton4"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Icon Button"
            style="@style/Widget.MaterialComponents.Button.Icon"
            android:id="@+id/materialButton5"
            app:icon="@drawable/ic_action_refresh"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintHorizontal_bias="0.495"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton4"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Icon Text Button"
            style="@style/Widget.MaterialComponents.Button.TextButton.Icon"
            android:id="@+id/materialButton6"
            app:icon="@drawable/ic_action_refresh"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton5"
            android:layout_marginEnd="8dp"
            app:layout_constraintEnd_toEndOf="parent"
            android:layout_marginStart="8dp"
            app:layout_constraintStart_toStartOf="parent"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Tint Icon Button"
            style="@style/Widget.MaterialComponents.Button.Icon"
            android:id="@+id/materialButton7"
            app:icon="@drawable/ic_action_refresh"
            app:iconTint="#b49e0c"
            app:iconTintMode="multiply"
            app:iconPadding="25dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton6"
            android:layout_marginStart="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginEnd="8dp"
            app:layout_constraintEnd_toEndOf="parent"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Colored Button"
            android:id="@+id/materialButton8"
            app:backgroundTint="#bc13a0"
            app:backgroundTintMode="multiply"
            android:padding="10dp"
            android:insetTop="25dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton7"
            android:layout_marginStart="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginEnd="8dp"
            app:layout_constraintEnd_toEndOf="parent"/>

    <com.google.android.material.button.MaterialButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Custom Material Button"
            android:id="@+id/materialButton9"
            app:cornerRadius="10dp"
            app:backgroundTint="#3f974b"
            app:backgroundTintMode="multiply"
            app:rippleColor="#ffee33"
            app:strokeColor="#8edea7"
            app:strokeWidth="2dp"
            android:layout_marginTop="8dp"
            app:layout_constraintTop_toBottomOf="@+id/materialButton8"
            android:layout_marginStart="8dp"
            app:layout_constraintStart_toStartOf="parent"
            android:layout_marginEnd="8dp"
            app:layout_constraintEnd_toEndOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>
gradle dependencies

// Material components
implementation 'com.google.android.material:material:1.6.1'

android kotlin - TextInputLayout and TextInputEditText example

MainActivity.kt

package com.cfsuman.kotlintutorials

import android.os.Bundle
import android.util.Patterns
import android.widget.*
import androidx.appcompat.app.AppCompatActivity
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.transition.TransitionManager
import com.google.android.material.button.MaterialButton
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout


class MainActivity : AppCompatActivity() {
    lateinit var rootLayout:ConstraintLayout
    lateinit var layoutEmail:TextInputLayout
    lateinit var layoutPassword:TextInputLayout
    lateinit var etEmail:TextInputEditText
    lateinit var etPassword:TextInputEditText

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val context:MainActivity = this

        // get the widgets reference from XML layout
        rootLayout = findViewById(R.id.rootLayout)
        layoutEmail = findViewById(R.id.layoutEmail)
        etEmail = findViewById(R.id.etEmail)
        layoutPassword = findViewById(R.id.layoutPassword)
        etPassword = findViewById(R.id.etPassword)
        val btnSignin = findViewById<MaterialButton>(R.id.btnSignin)


        // Button click listener
        btnSignin.setOnClickListener {
            if (isValidForm()){
                Toast.makeText(
                    context,
                    "Login success",
                    Toast.LENGTH_SHORT
                ).show()
            }
        }
    }



    // Custom method to validate form inputted data
    private fun isValidForm():Boolean{
        var isValid = true


        val email = etEmail.text.toString().trim()
        val password = etPassword.text.toString().trim()


        TransitionManager.beginDelayedTransition(rootLayout)
        if (!email.isValidEmail()){
            layoutEmail.isErrorEnabled = true
            layoutEmail.error = "input your email"
            isValid = false
        }else{
            layoutEmail.isErrorEnabled = false
        }


        if (password.isEmpty()){
            layoutPassword.isErrorEnabled = true
            layoutPassword.error = "Input password"
            isValid = false
        }else{
            layoutPassword.isErrorEnabled = false
        }

        return isValid
    }
}



// Extension function to validate email address
fun String.isValidEmail(): Boolean
        = this.isNotEmpty() &&
        Patterns.EMAIL_ADDRESS.matcher(this).matches()
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:id="@+id/rootLayout"
    android:padding="24dp">

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/layoutEmail"
        style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/etEmail"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Email" />
    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.textfield.TextInputLayout
        android:id="@+id/layoutPassword"
        style="@style/Widget.MaterialComponents.TextInputLayout.FilledBox"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="16dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/layoutEmail">

        <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/etPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Password"
            android:inputType="textPassword" />
    </com.google.android.material.textfield.TextInputLayout>

    <com.google.android.material.button.MaterialButton
        android:id="@+id/btnSignin"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="24dp"
        android:text="Signin"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/layoutPassword" />

</androidx.constraintlayout.widget.ConstraintLayout>
build.gradle dependencies[add]

// Material components
implementation 'com.google.android.material:material:1.6.1'

android kotlin - Google maps example






MainActivity.kt



package com.cfsuman.kotlingooglemapsexample

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import com.google.android.gms.maps.GoogleMap
import com.google.android.gms.maps.OnMapReadyCallback
import com.google.android.gms.maps.SupportMapFragment
import com.google.android.gms.maps.CameraUpdateFactory
import com.google.android.gms.maps.model.MarkerOptions
import com.google.android.gms.maps.model.LatLng


class MainActivity : AppCompatActivity(), OnMapReadyCallback{

private var mMap: GoogleMap? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val mapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
}


override fun onMapReady(googleMap: GoogleMap) {
mMap = googleMap

// Add a marker in Dhaka, Bangladesh, and move the camera.
val dhaka = LatLng(23.777176, 90.399452)
mMap?.let {
it.addMarker(MarkerOptions().position(dhaka).title("Marker in Dhaka"))
it.moveCamera(CameraUpdateFactory.newLatLng(dhaka))
}
}
}




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"
tools:context=".MainActivity"
>
<fragment
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>





AndroidManifest.xml



<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.cfsuman.kotlingooglemapsexample"
>

<application
android:allowBackup="true"
android:fullBackupOnly="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">

<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

<!--
get your map api key from here
https://cloud.google.com/console/google/maps-apis/overview

Enable maps api from here
https://console.cloud.google.com/apis/library/maps-android-backend.googleapis.com
-->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_api_key"/>

<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>





build.gradle [app]



apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.cfsuman.kotlingooglemapsexample"
minSdkVersion 19
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.0.0-alpha1'
implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'

// Material components
implementation 'com.google.android.material:material:1.0.0-beta01'

// Android KTX
implementation 'androidx.core:core-ktx:1.0.0-beta01'

// Anko Commons
implementation 'org.jetbrains.anko:anko-commons:0.10.5'

// Volley network calling library
implementation 'com.android.volley:volley:1.1.0'

// Google maps
implementation 'com.google.android.gms:play-services-maps:15.0.1'

// Google Maps Android API Utility Library
implementation 'com.google.maps.android:android-maps-utils:0.5'
}





gradle.properties [partial]



# add this two lines
android.useAndroidX=true
android.enableJetifier=true









android kotlin - Room database example

MainActivity.kt

package com.cfsuman.jetpackexamples

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import kotlinx.android.synthetic.main.activity_main.*
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.toast
import org.jetbrains.anko.uiThread
import java.util.*


class MainActivity : AppCompatActivity() {

    private lateinit var mDb:RoomSingleton
    private val mRandom:Random = Random()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // Initialize the room database
        mDb = RoomSingleton.getInstance(applicationContext)

        // Make the text view scrollable
        textView.movementMethod = ScrollingMovementMethod()

        // Insert button click listener
        btnInsert.setOnClickListener{
            // Initialize a new student
            val student = Student(id = null,
                    fullName = UUID.randomUUID().toString(),
                    result = mRandom.nextInt(100)
            )

            doAsync {
                // Put the student in database
                mDb.studentDao().insert(student)

                uiThread {
                    toast("One record inserted.")
                }
            }
        }


        // Select button click listener
        btnSelect.setOnClickListener{
            doAsync {
                // Get the student list from database
                val list = mDb.studentDao().allStudents()

                uiThread {
                    toast("${list.size} records found.")
                    // Display the students in text view
                    textView.text = ""
                    for (student in list){
                        textView.append("${student.id} : ${student.fullName} : ${student.result}\n")
                    }
                }
            }
        }
    }
}
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"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btnInsert"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="Insert Data"
        app:layout_constraintEnd_toStartOf="@+id/btnSelect"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnSelect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="Select Data"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toEndOf="@+id/btnInsert"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnInsert" />

</androidx.constraintlayout.widget.ConstraintLayout>
RoomSingleton.kt

package com.cfsuman.jetpackexamples

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase
import android.content.Context


@Database(entities = arrayOf(Student::class), version = 1)
abstract class RoomSingleton : RoomDatabase() {
    abstract fun studentDao():studentDao

    companion object {
        private var INSTANCE: RoomSingleton? = null
        fun getInstance(context: Context): RoomSingleton {
            if (INSTANCE == null) {
                INSTANCE = Room.databaseBuilder(
                        context,
                        RoomSingleton::class.java,
                        "roomdb")
                        .build()
            }
            return INSTANCE as RoomSingleton
        }
    }
}
RoomDao.kt

package com.cfsuman.jetpackexamples

import androidx.room.Dao
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query

@Dao
interface studentDao{
    @Query("SELECT * FROM studentTbl")
    fun allStudents():List<Student>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(student:Student)
}
RoomEntity.kt

package com.cfsuman.jetpackexamples

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "studentTbl")
data class Student(
        @PrimaryKey
        var id:Long?,

        @ColumnInfo(name = "uuid")
        var fullName: String,

        @ColumnInfo(name = "result")
        var result:Int
)
build.gradle [app level]

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'


android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.cfsuman.jetpackexamples"
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.1.0-alpha3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha3'

    // Material components
    implementation 'com.google.android.material:material:1.0.0-beta01'

    // Room database
    def room_version = "2.0.0-beta01"
    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"
    kapt 'androidx.room:room-compiler:2.0.0-beta01'

    // Android KTX
    implementation 'androidx.core:core-ktx:1.0.0-beta01'

    // Anko Commons
    implementation "org.jetbrains.anko:anko-commons:0.10.5"
}

Android Kotlin: How to create and use a HashMap

This code demonstrates how to work with HashMaps in an Android application written with Kotlin. HashMaps are a fundamental data structure used to store collections of key-value pairs. The code showcases three types of HashMaps: MutableHashMap, HashMap, and LinkedHashMap. Each type offers slight variations in behavior.

The code provides a clear separation between the UI layout (defined in activity_main.xml) and the logic behind the button clicks (implemented in MainActivity.kt). When a button is clicked, it triggers specific functionalities related to the chosen HashMap type. The functionalities include adding key-value pairs, iterating through the map, removing entries, updating values, and checking for emptiness. The results are displayed on the TextView element.

Summary

This code provides a valuable learning resource for Android developers working with Kotlin. It offers a practical example of using different HashMap types, demonstrating their functionalities and potential use cases within an Android application. By understanding these functionalities, developers can effectively store and manage key-value pairs within their apps.


MainActivity.kt

package com.cfsuman.kotlintutorials

import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // get the widgets reference from XML layout
        val textView = findViewById<TextView>(R.id.textView)
        val btnMutableHashMap = findViewById<Button>(
            R.id.btnMutableHashMap)
        val btnHashMap = findViewById<Button>(R.id.btnHashMap)
        val btnLinkedHashMap = findViewById<Button>(
            R.id.btnLinkedHashMap)


        // make textview content scrollable
        textView.movementMethod = ScrollingMovementMethod()


        // Mutable hash map example
        btnMutableHashMap.setOnClickListener{
            val builder = StringBuilder()

            // Initialize a new empty mutable hash map
            val colors = mutableMapOf<String,String>()
            // Put some key value pairs to hash map
            colors["INDIANRED"] = "#CD5C5C"
            colors["CRIMSON"] = "#DC143C"
            colors["SALMON"] = "#FA8072"
            colors["LIGHTCORAL"] = "#F08080"

            builder.append("Loop through the mutable hash map")
            colors.forEach{ (key, value) ->
                builder.append("\n$key,$value")
            }

            colors.remove("CRIMSON")
            builder.append("\n\n After remove an item")
            for ((key,value) in colors){
                builder.append("\n$key:$value")
            }


            // Replace/update a value
            colors["SALMON"] = "NEW VALUE"
            builder.append("\n\n After updating a value")
            colors.forEach{ (key, value) ->
                builder.append("\n$key,$value")
            }

            // Check whether hash map is empty
            builder.append("\n\nHashMap is empty? " +
                    ": ${colors.isEmpty()}")

            // Get value by key from hash map
            val value = colors["LIGHTCORAL"]
            builder.append("\n\nLIGHTCORAL value $value")

            // Initialize a new hash map with key and value pairs
            val reds = mutableMapOf("RED" to "#FF0000",
                "FIREBRICK" to "#B22222", "CRIMSON" to "#DC143C")

            // Loop through the map
            builder.append("\n\nLoop through the new mutable hash map")
            reds.forEach{ (key, value) ->
                builder.append("\n$key : $value")
            }

            textView.text = builder.toString()
        }



        // Immutable hash map example
        btnHashMap.setOnClickListener{
            val builder = StringBuilder()

            // Initialize a new hash map with keys and values
            val colors = mapOf(
                "GOLD" to "#FFD700",
                "YELLOW" to "#FFFF00",
                "ALICEBLUE" to "#F0F8FF",
                "BISQUE" to "#FFE4C4"
            )

            builder.append("Loop through the map\n")
            // Loop through the map
            colors.forEach{ (key, value) ->
                builder.append("\n$key : $value")
            }

            // Map keys to list
            val keys:List<String> = colors.keys.toList()

            // Map values to list
            val values:List<String> = colors.values.toList()


            // Loop through the map keys list
            builder.append("\n\nHashMap keys list\n")
            keys.forEach{
                builder.append("$it,")
            }

            // Loop through the map values list
            builder.append("\n\nHashMap values list\n")
            values.forEach{
                builder.append("$it,")
            }

            textView.text = builder.toString()
        }



        // Linked hash map example
        btnLinkedHashMap.setOnClickListener{
            val builder = StringBuilder()

            val colors = linkedMapOf<String,String>()
            colors["TEAL"] = "#008080"
            colors["AQUA"] = "#00FFFF"
            colors["LIGHTCYAN"] = "#E0FFFF"
            colors["BLUE"] = "#0000FF"
            colors["ROSYBROWN"] = "#BC8F8F"

            builder.append("Loop through the linked hash map\n")
            // Loop through the linked hash map
            colors.forEach{ (key, value) ->
                builder.append("\n$key : $value")
            }

            textView.text = builder.toString()
        }
    }
}
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="#F8F8F8"
    android:padding="8dp">

    <Button
        android:id="@+id/btnMutableHashMap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Mutable HashMap"
        android:textAllCaps="false"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnHashMap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="HashMap"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="@+id/btnMutableHashMap"
        app:layout_constraintStart_toEndOf="@+id/btnMutableHashMap" />

    <Button
        android:id="@+id/btnLinkedHashMap"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="Linked HM"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="@+id/btnHashMap"
        app:layout_constraintStart_toEndOf="@+id/btnHashMap" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="8dp"
        android:fontFamily="sans-serif"
        android:textSize="18sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnMutableHashMap" />

</androidx.constraintlayout.widget.ConstraintLayout>

Android Kotlin: How to create and use an Enum

This code demonstrates how to create and use enums in an Android application written in Kotlin. Enums are a special kind of class that defines a set of named constants. They offer several advantages over simple string constants, including improved type safety, readability, and access to additional functionalities.

The code includes an example activity (MainActivity.kt) that showcases three different types of enums:

  • A basic enum with simple constants (like Position).
  • An enum with each constant holding a single additional value (like Capital).
  • An enum with each constant holding multiple additional values (like Country).

The activity displays information about these enums upon clicking corresponding buttons.

Summary

By following this example, you'll gain a solid understanding of how to define and utilize enums in your Android projects. This approach enhances code maintainability, readability, and reduces the risk of errors by ensuring that only valid values can be assigned to enum variables.


MainActivity.kt

package com.cfsuman.kotlintutorials

import android.os.Bundle
import android.text.method.ScrollingMovementMethod
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // get the widgets reference from XML layout
        val textView = findViewById<TextView>(R.id.textView)
        val btnBasicEnum = findViewById<Button>(R.id.btnBasicEnum)
        val btnEnumValues = findViewById<Button>(R.id.btnEnumValues)
        val btnMultiValues = findViewById<Button>(R.id.btnMultiValues)


        // make textview content scrollable
        textView.movementMethod = ScrollingMovementMethod()


        // Basic enum class
        btnBasicEnum.setOnClickListener{
            val builder = StringBuilder()
            builder.append("Basic usage of enum class")
            builder.append("\n\nPosition.Top = ${Position.Top}")
            builder.append("\nPosition.Right = ${Position.Right}")
            builder.append("\nPosition.Bottom = ${Position.Bottom}")
            builder.append("\nPosition.Left = ${Position.Left}")
            textView.text = builder.toString()
        }


        // Enum with values
        btnEnumValues.setOnClickListener{
            val builder = StringBuilder()
            builder.append("Enum with values")
            builder.append("\n\nBangladesh = ${
                Capital.Bangladesh.capital}")
            builder.append("\nIndia = ${Capital.India.capital}")
            builder.append("\nSweden = ${Capital.Sweden.capital}")
            builder.append("\nAustralia = ${
                Capital.Australia.capital}")
            builder.append("\nQatar = ${Capital.Qatar.capital}")
            textView.text = builder.toString()
        }


        // Enum with multiple values
        btnMultiValues.setOnClickListener{
            val builder = StringBuilder()
            builder.append("Enum with multiple values")
            builder.append("\n\nAustria = ${Country.Austria.capital} " +
                    ": ${Country.Austria.currency}")
            builder.append("\nChina = ${Country.China.capital} " +
                    ": ${Country.China.currency}")
            builder.append("\nEgypt = ${Country.Egypt.capital} " +
                    ": ${Country.Egypt.currency}")
            builder.append("\nFrance = ${Country.France.capital} " +
                    ": ${Country.France.currency}")
            textView.text = builder.toString()
        }
    }
}



// Basic enum class
enum class Position{
    Top, Right, Bottom, Left
}


// Enum with values
enum class Capital(val capital:String){
    Bangladesh("Dhaka"),
    India("New Delhi"),
    Sweden("Stockholm"),
    Australia("Canberra"),
    Qatar("Doha")
}


// Enum with multiple values
enum class Country(val capital:String, val currency:String){
    Austria("Vienna","Euro"),
    China("Beijing","Chinese Yuan"),
    Egypt("Cairo","Egyptian Pound"),
    France("Paris","Euro; CFP Franc")
}
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="#F8F8F8"
    android:padding="8dp">

    <Button
        android:id="@+id/btnBasicEnum"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Basic Enum"
        android:textAllCaps="false"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/btnEnumValues"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="Enum Values"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="@+id/btnBasicEnum"
        app:layout_constraintStart_toEndOf="@+id/btnBasicEnum" />

    <Button
        android:id="@+id/btnMultiValues"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:text="Multi Values"
        android:textAllCaps="false"
        app:layout_constraintBottom_toBottomOf="@+id/btnEnumValues"
        app:layout_constraintStart_toEndOf="@+id/btnEnumValues" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="16dp"
        android:fontFamily="sans-serif"
        android:textSize="24sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btnBasicEnum" />

</androidx.constraintlayout.widget.ConstraintLayout>