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>