Skip to main content

Android kotlin: How to create and use extension function

Introduction

This code demonstrates the concept of Extension Functions in Android development using Kotlin. Extension functions allow you to add functionalities to existing classes without modifying their original code. This approach promotes code reusability, readability, and reduces code clutter in the main activity class.

Breakdown of the Code

The code consists of three main parts:

  1. MainActivity.kt: This file contains the main activity class that interacts with the UI elements. It retrieves a reference to a TextView widget from the layout and utilizes various extension functions to manipulate its properties and behavior.

  2. MyExtensionFunctions.kt: This file houses a collection of extension functions specifically designed for the TextView class. These functions offer functionalities like underlining text, retrieving width and height in pixels, adding a shadow effect, and setting dummy text.

  3. activity_main.xml: This file defines the layout of the activity. It includes a single TextView element with its properties configured.

How Extension Functions are Used

  • Setting Dummy Text: The dummyText() extension function simplifies setting predefined text for the TextView. It directly sets the text content within the function.
  • Displaying Toast Message: The toast() extension function provides a convenient way to display toast messages from the context object. It takes the message string and an optional duration parameter.
  • Underlining Text: The underline() extension function modifies the paint flags of the TextView to enable underlining for the text content.
  • (Commented Out) Getting Text Dimensions: The commented-out functions width() and height() demonstrate how to retrieve the measured width and height of the TextView in pixels.
  • (Commented Out) Adding Text Shadow: The commented-out shadow() function showcases adding a shadow effect to the TextView text with customizable parameters.

Summary

By leveraging extension functions, the code in MainActivity.kt becomes more concise and easier to maintain. It promotes code reusability as the extension functions can be utilized in other parts of the application where similar functionalities are needed for TextView elements. The separation of these functions into a dedicated file like MyExtensionFunctions.kt further enhances code organization.


MainActivity.kt

package com.cfsuman.kotlintutorials

import android.content.Context
import android.os.Bundle
import android.widget.TextView
import android.widget.Toast
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)


        // Put some dummy text to the text view
        // using extension function
        textView.dummyText()


        // Set a click listener for text view widget
        textView.setOnClickListener{
            // Display toast message using extension function
            toast("Toast using extension function")
            //toast("TextView Width : ${it.width} pixels
            // and Height: ${it.height} pixels")
        }


        // Under line text view text using extension function
        // This extension function exist in a separate file
        textView.underline()


        // Add shadow effect to text view text
        //text_view.shadow()
    }



    // Extension function which written in calling file
    private fun Context.toast(
        message: String,
        duration: Int = Toast.LENGTH_SHORT
    ){
        // Extend the Context object to show a Toast easily
        Toast.makeText(this,message,Toast.LENGTH_SHORT).show()
    }
}
MyExtensionFunctions.kt

package com.cfsuman.kotlintutorials

import android.graphics.Color
import android.graphics.Paint
import android.widget.TextView


// Extension function to extend TextView functionality
// Function make text view text to underlined
fun TextView.underline(){
    /*
        Keyword 'this' represent the object/widget which functionality
        we want to extend. In this function 'this' represent the 'TextView'
     */
    this.paintFlags = this.paintFlags or Paint.UNDERLINE_TEXT_FLAG;
}


// Get the text view width in pixels
fun TextView.width():Int{
    this.measure(0,0)
    return this.measuredWidth
}


// Get the text view height in pixels
fun TextView.height():Int{
    this.measure(0,0)
    return this.measuredHeight
}


// Add shadow to text view text
fun TextView.shadow(){
    this.setShadowLayer(
        1.3f, // radius
        4.0f, // dx
        4.0f, // dy
        Color.parseColor("#FF2B2B2B") // shadow color
    )
}


// Put some dummy text to text view
fun TextView.dummyText(){
    this.text = "Lorem Ipsum is simply dummy text of the printing and" +
            " typesetting industry. Lorem Ipsum has been the industry's" +
            " standard dummy text ever since the 1500s, when an unknown" +
            " printer took a galley of type and scrambled" +
            " it to make a type specimen book."
}
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="24dp">

    <TextView
        android:id="@+id/textView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:fontFamily="sans-serif"
        android:textSize="28sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Popular posts from this blog

Restricting Jetpack Compose TextField to Numeric Input Only

Jetpack Compose has revolutionized Android development with its declarative approach, enabling developers to build modern, responsive UIs more efficiently. Among the many components provided by Compose, TextField is a critical building block for user input. However, ensuring that a TextField accepts only numeric input can pose challenges, especially when considering edge cases like empty fields, invalid characters, or localization nuances. In this blog post, we'll explore how to restrict a Jetpack Compose TextField to numeric input only, discussing both basic and advanced implementations. Why Restricting Input Matters Restricting user input to numeric values is a common requirement in apps dealing with forms, payment entries, age verifications, or any data where only numbers are valid. Properly validating input at the UI level enhances user experience, reduces backend validation overhead, and minimizes errors during data processing. Compose provides the flexibility to implement ...

jetpack compose - TextField remove underline

Compose TextField Remove Underline The TextField is the text input widget of android jetpack compose library. TextField is an equivalent widget of the android view system’s EditText widget. TextField is used to enter and modify text. The following jetpack compose tutorial will demonstrate to us how we can remove (actually hide) the underline from a TextField widget in an android application. We have to apply a simple trick to remove (hide) the underline from the TextField. The TextField constructor’s ‘colors’ argument allows us to set or change colors for TextField’s various components such as text color, cursor color, label color, error color, background color, focused and unfocused indicator color, etc. Jetpack developers can pass a TextFieldDefaults.textFieldColors() function with arguments value for the TextField ‘colors’ argument. There are many arguments for this ‘TextFieldDefaults.textFieldColors()’function such as textColor, disabledTextColor, backgroundColor, cursorC...

jetpack compose - Image clickable

Compose Image Clickable The Image widget allows android developers to display an image object to the app user interface using the jetpack compose library. Android app developers can show image objects to the Image widget from various sources such as painter resources, vector resources, bitmap, etc. Image is a very essential component of the jetpack compose library. Android app developers can change many properties of an Image widget by its modifiers such as size, shape, etc. We also can specify the Image object scaling algorithm, content description, etc. But how can we set a click event to an Image widget in a jetpack compose application? There is no built-in property/parameter/argument to set up an onClick event directly to the Image widget. This android application development tutorial will demonstrate to us how we can add a click event to the Image widget and make it clickable. Click event of a widget allow app users to execute a task such as showing a toast message by cli...