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:
-
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.
-
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.
-
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()andheight()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.
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()
}
}
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."
}
<?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>
