Skip to content

Exploring more Advanced UI Components – Day 7 Android 14 Masterclass

Exploring more Advanced UI Components - Day 7 Android 14 Masterclass
Become a developer with our complete learning paths
Become a developer with our complete learning paths

Exploring more Advanced UI Components – Day 7 Android 14 Masterclass

Welcome to Day 7 of the Android 14 Masterclass! Throughout this article, we’ll explore Advanced UI components: the efficiency of LazyColumn for handling extensive lists, the dynamics of AlertDialog for interactive user notifications, and the simplicity of lambdas for concise coding. We’ll also demystify the RoundedCornerShape function to add finesse to your composables, utilize IconButton and Icons for intuitive user interfaces, and leverage the map function for transforming collections. Plus, we’ll touch upon the copy method’s role in data manipulation, the let function‘s utility with nullable types, and find‘s efficacy in searching collections.


1. What is a Lazy Column?


A LazyColumn is a part of Jetpack Compose, Android’s modern UI toolkit. Imagine you have a long list of items that you want to display on the screen, like a list of contacts, messages, or products. If you try to load and display all items at once, it might slow down your app because it’s a lot of information to process and show.

Here’s where LazyColumn comes to the rescue! It’s smart and “lazy.” It only loads and displays the items that fit on the screen.

As the user scrolls down, LazyColumn cleverly loads more items on-the-go. This way, your app remains smooth and responsive, providing a better user experience.


The basic structure of a LazyColumn looks like this:

  • LazyColumn is the container that holds and manages the list.
  • items(listOfItems) tells the LazyColumn what data to display.
  • { item -> /* Your code */ } is where you define how each item in the list should look and behave.


Example 1: Displaying a Simple List of Texts

In this example, LazyColumn displays a list of fruits. Each fruit name appears as a text on the screen.

Example 2: Displaying a List of Numbers with a Divider

Here, LazyColumn shows a list of numbers. Each number is followed by a divider line to separate it from the next number.

Example 3: Displaying a List of Custom Composables

Imagine you have a composable function called CustomCard that displays information in a fancy way. You can use it inside LazyColumn like this:

In this case, LazyColumn uses your CustomCard composable to display each item in the list, making the list look more customized and appealing.

LazyColumn is like a smart assistant that helps you display long lists efficiently, ensuring your app runs smoothly. By understanding its structure and how to use it, you can create lists that are both beautiful and performance-optimized in your Android apps.


2. Advanced UI components: AlertDialog Composable


An AlertDialog in Android’s Jetpack Compose is a type of pop-up window that appears in front of the main content of the app. It’s used to capture user attention and convey important information or get user input.

For example, you might use an AlertDialog to confirm user actions, show error messages, or ask for user choices or decisions.


An AlertDialog typically consists of:

  • Title: A brief header that tells the user what the dialog is about.
  • Text: A message that provides more detailed information or instructions.
  • Buttons: Actions that the user can take, such as “OK”, “Cancel”, or custom actions.

Here’s a basic structure of an AlertDialog:


Example 1: A Simple AlertDialog with Text and an OK Button

This example shows a basic AlertDialog with a title, a text message, and an “OK” button that closes the dialog when clicked.

Example 2: AlertDialog with Custom Buttons

In this example, the AlertDialog asks the user for confirmation and provides “Yes” and “No” buttons for user actions.

Example 3: AlertDialog without a Title

This AlertDialog is simpler, with no title, just a message, and a “Close” button.

An AlertDialog is a powerful tool to communicate with users, get their decisions, or provide important information in a focused way.

Understanding its components and how to customize them allows you to create dialogs that enhance user interaction and make your app more intuitive and user-friendly.


3. Understanding Lambdas


Lambdas are a feature in Kotlin (and many other programming languages) that allows you to treat functionality as a method argument, or create concise ways to express functions/methods.

In simpler terms, a lambda is like a mini-function that you can create on the fly without needing a name.

Lambdas are useful for short, simple operations that are used right away, often as arguments to other functions.


A lambda expression is always enclosed in curly braces {}. It may have parameters, and it may return a value. The parameters are defined at the start of the lambda, followed by an arrow ->, and then comes the body of the lambda.

Here is a general structure:


Example 1: A Lambda with No Parameters

In this example, sayHello is a lambda that takes no parameters and prints a message. We call this lambda just like a regular function.

Example 2: A Lambda that Takes Parameters

Here, add is a lambda that takes two integers as parameters and returns their sum. It is then called with two numbers as arguments.

Example 3: Lambdas as Function Arguments

Lambdas are often used as arguments to higher-order functions (functions that take other functions as parameters). Here’s an example with a List’s .forEach method:

Example 4: Simplifying Lambdas

If a lambda has only one parameter and its parameter is not used in the body, you can simplify it further:

Here, it is an implicit name of the single parameter, making the lambda shorter and more concise.

Lambdas are like lightweight, unnamed functions that you can use for quick, simple tasks, and pass around as arguments.

Understanding lambdas can help make your code more concise and expressive, allowing for cleaner and more readable code structures.


4. What is the RoundedCornerShape Function?

Theory: Advanced UI components

In Android’s Jetpack Compose, the RoundedCornerShape function is used to create shapes with rounded corners. It’s often applied to UI elements like buttons, cards, or containers to give them a softer, more aesthetically pleasing appearance.

Rounded corners can make the user interface feel more modern and less harsh compared to sharp corners.


The RoundedCornerShape function can take different parameters to define the radius of the corners. You can specify the same radius for all corners or define each corner’s radius individually.

Here’s a basic structure:

cornerSize: The radius applied to all corners.


Example 1: Applying Rounded Corners to a Box

In this example, a Box with a blue background and rounded corners contains a text. The corners are rounded by 10 density-independent pixels (dp).

Example 2: Different Radii for Each Corner

Here, each corner of the Box has a different radius, allowing for a custom appearance.

Example 3: Applying Rounded Corners to a Button

In this example, a button with rounded corners is created. The shape parameter is used to apply the RoundedCornerShape function to the button.

The RoundedCornerShape function is a simple yet powerful tool to enhance the appearance of your UI elements in Jetpack Compose. It allows you to apply rounded corners to various components, making your app’s interface more appealing and user-friendly.

Understanding how to use this function enables you to customize the shapes in your app effectively.


5. Advanced UI components: IconButton and Icons


In Jetpack Compose, IconButton and Icon are two components used to create and display icons within your app.

  • Icon: An Icon is a graphical representation used to quickly communicate a concept or action without using text. It displays images, like symbols or glyphs.
  • IconButton: An IconButton is a clickable icon. It’s an Icon wrapped in a clickable area, used to trigger actions when the user taps on it.

Syntax: Advanced UI components


  • imageVector: The vector image to be displayed.
  • contentDescription: A description of the icon for accessibility purposes. It can be null if the icon is only decorative.


onClick: A lambda function that gets executed when the icon is clicked.


Example 1: Displaying a Simple Icon

This code snippet displays a simple home icon on the screen.

Example 2: Creating a Clickable Icon (IconButton)

Here, the home icon becomes clickable. When clicked, it prints a message to the console.

Example 3: IconButton with Custom Actions

In this example, the forward arrow icon can be clicked to perform a custom action, like navigating to another screen.


Example 4: Changing the Icon Color

This code changes the color of the home icon to red.

IconButton and Icon are essential components in Jetpack Compose, allowing you to incorporate intuitive graphical elements into your app’s UI.

Understanding how to use and customize these icons will enable you to create a more user-friendly and visually appealing application interface.


6. What is the Map Function?


In Kotlin, the map function is a powerful tool used with collections, like lists and arrays. It allows you to transform each element in the collection based on a specific rule or function, creating a new collection with the transformed elements.

Imagine you have a box of raw materials, and you want to turn each piece into a finished product. The map function acts like a machine that processes each raw material into a finished product, giving you a box of finished products at the end.


The map function is applied to a collection and takes a lambda function as its argument. The lambda function defines how each element should be transformed.

Here is a basic structure:


Example 1: Doubling Each Number in a List

In this example, each number in the list is doubled, creating a new list of doubled numbers.

Example 2: Converting a List of Strings to Uppercase

Here, each word in the list is converted to uppercase, resulting in a new list of uppercase words.

Example 3: Extracting Length of Strings in a List

This example creates a new list containing the length of each name in the original list.

Example 4: Applying Multiple Transformations

Multiple transformations are applied to each number in this example: each number is doubled, and then one is added.

The map function is like a magical wand that helps you transform collections effortlessly.

By understanding how to use it, you can perform a wide range of transformations on your data, making your code more concise and expressive.


7. What is the Copy Method?


In Kotlin, when you are working with data classes, you often encounter situations where you want to create a new object that is a modified version of an existing object.

The copy method comes in handy in such cases. It allows you to create a new object that is a copy of the existing object with some attributes changed as per your needs.

Imagine you have a cookie, and you want to make another cookie that is almost the same but with different toppings. The copy method helps you create this new cookie without altering the original one.


The copy method is applied to an instance of a data class. You can specify which attributes you want to modify in the new object.

Here is a basic structure:


Example 1: Creating a Modified Copy of a Data Class

In this example, a new Person object is created with the age modified, while the original Person object remains unchanged.

Example 2: Changing Multiple Attributes

Here, a new Book object is created with both the title and published year modified.

Example 3: Using the Copy Method in Functions

In this example, the copy method is used inside a function to update the author of a Book object.

The copy method is a convenient tool for creating modified versions of objects in Kotlin, especially when working with data classes. It helps maintain the immutability of objects, promoting a functional programming style and making your code more robust and easier to understand.


8. Let Function and Nullable Strings


  • Nullable Strings: In Kotlin, strings can be nullable, meaning they can have a value or be null. A nullable string is declared with a question mark (?) after the type String.
  • Let Function: The let function is used with nullable objects. It executes a block of code only if the object is non-null. It’s a way to perform operations on an object only when it has a value, helping to avoid null pointer exceptions.


  • Nullable Strings:

  • Let Function:


Example 1: Using Let to Safely Access a Nullable String

In this example, the let function allows safe access to the nullable string name. The code inside let only executes when name is not null.

Example 2: Transforming a Nullable String with Let

Here, the let function is used to transform the string to uppercase if it is not null.

Example 3: Using Let for Conditional Execution

In this example, the let function is used to conditionally check the strength of a password, but only if the password is not null.

Understanding nullable strings and the let function is crucial for writing safe and efficient Kotlin code. The let function allows you to work with nullable objects gracefully, ensuring that operations are only performed when the object has a non-null value, thus helping prevent unexpected errors in your applications.


9. Find Function


In Kotlin, the find function is used with collections such as lists and sets. It helps you search for an element that satisfies a certain condition or criteria.

If it finds an element that meets the condition, it returns that element; otherwise, it returns null.

Imagine you have a box of assorted fruits, and you want to find the first apple in the box. The find function acts like a helper who goes through each fruit in the box and hands you the first apple it finds.


The find function is applied to a collection and takes a lambda function as its argument. The lambda function defines the condition that an element must meet to be returned.

Here is a basic structure:


Example 1: Finding a Number in a List

In this example, the find function searches for a number greater than 3 in the list and returns the first one it finds.

Example 2: Finding a Word in a List

Here, the find function looks for a word that starts with the letter “b” and returns it.

Example 3: Find Function Returning Null

In this case, since there is no “yellow” in the list, the find function returns null.

Example 4: Finding an Object in a List of Objects

Here, the find function is used to find a person object with an age less than 30 in a list of Person objects.

The find function is a helpful tool in Kotlin for searching collections based on specific conditions. It simplifies the code, making it more readable and concise, and helps in efficiently finding elements in collections based on custom search criteria.


10. Advanced UI components: background() 


In Jetpack Compose, background() is a modifier that you can apply to composables (UI elements) to set their background color. It helps in visually distinguishing different parts of the UI, making the interface more attractive and easier to understand.

Imagine you have a plain piece of paper, and you want to highlight some parts of it. Applying background() is like coloring the background of certain areas to make them stand out.


To use background(), you apply it as a modifier to a composable, specifying the color you want.

Here is a basic structure:


Example 1: Applying Background Color to a Box

In this example, a Box composable has a red background, and it contains a text element.

Example 2: Applying Background Color to a Text

Here, the background(Color.) modifier is applied directly to a Text composable, giving the text a blue background.

Example 3: Using Custom Colors

In this example, a custom color is defined and applied as the background color of a Box.

Example 4: Applying Background Color to a Button

For a Button, the background color is applied a bit differently, using buttonColors to specify the background color.

The background() modifier in Jetpack Compose is a simple yet powerful tool to enhance the visual appearance of your UI elements.

By understanding how to apply background colors, you can create a more visually appealing and user-friendly interface in your Android apps.


11. Arrangement.SpaceBetween and Arrangement.SpaceEvenly

Advanced UI components: Arrangement.SpaceBetween

Arrangement.SpaceBetween is a concept used in Jetpack Compose to define the spacing of elements within a layout, such as a Row or Column.

When you use Arrangement.SpaceBetween, it ensures that the elements within the layout are spaced out such that they are spread across the available space with equal spacing between them, but not at the start and end of the layout.

Imagine you have a long shelf, and you want to place a few books on it.

Using Arrangement.SpaceBetween is like placing the first book at the start of the shelf, the last book at the end, and the remaining books spaced out evenly in between, leaving no extra space at the ends.


Advanced UI components: Arrangement.SpaceEvenly

Arrangement.SpaceEvenly, on the other hand, distributes the elements within a layout evenly concerning the available space.

This means that the spacing between each element, as well as the spacing at the start and end of the layout, is equal.

Going back to the shelf analogy, using Arrangement.SpaceEvenly is like placing the books on the shelf with equal spaces between each book, as well as equal spaces from the first and last books to the ends of the shelf.


12. Advanced UI components: Modifier.wrapContentSize()

Modifier.wrapContentSize() is a modifier in Jetpack Compose, a modern Android UI toolkit, used to adjust the size of a UI element, or “composable”, to fit its content.

When you apply this modifier to a composable, it ensures that the composable is just big enough to enclose its content, without any extra space.

How to Use It:

You apply Modifier.wrapContentSize() to a composable as part of its modifiers, like this:

In this example, a Text composable is given the wrapContentSize() modifier, ensuring that the text has just enough space to display “Hello, world!” without extra empty space around it.

Modifier.wrapContentSize() is a handy tool to make a composable’s size as compact as possible, fitting its content closely. It helps in creating a neat and efficient UI layout by avoiding unnecessary space usage.


Conclusion: Exploring more Advanced UI Components – Day 7 Android 14 Masterclass

Mastering Advanced UI components in Android development is not just about making your apps work well but also about crafting an experience that stands out. Today’s journey through LazyColumn, AlertDialog, lambdas, RoundedCornerShape, IconButtons, the map function, and more, has equipped you with the tools to push the boundaries of what’s possible with Android’s Jetpack Compose. Whether you’re refining the user interface with rounded corners or ensuring safety with nullable types and the let function, these advanced components and methods will help you to build and innovate with confidence and creativity.


If you want to skyrocket your Android career, check out our The Complete Android 14 & Kotlin Development Masterclass. Learn Android 14 App Development From Beginner to Advanced Developer.

Master Jetpack Compose to harness the cutting-edge of Android development, gain proficiency in XML — an essential skill for numerous development roles, and acquire practical expertise by constructing real-world applications.


Check out Day 5 of this course here.

Check out Day 6 of this course here.

Check out Day 8 of this course here.


Lost in coding? Discover our Learning Paths!
Lost in coding? Discover our Learning Paths!