Fragments in Android Development


Fragments are a key component in Android development that allow you to create reusable UI components within an activity. A fragment represents a portion of the user interface or behavior in an activity. Fragments make it easier to design flexible and modular UIs, especially for devices with varying screen sizes such as phones and tablets.

1. What are Fragments?

A Fragment is a modular section of an activity. It has its own layout, behavior, and can be added or removed from an activity while the activity is running. Unlike activities, fragments cannot exist independently; they must be hosted within an activity.

Fragments allow developers to build dynamic UIs by combining multiple fragments into a single activity. This is particularly useful for large-screen devices like tablets, where you can display more than one fragment at a time.

2. Lifecycle of a Fragment

Fragments have their own lifecycle, which is closely tied to the lifecycle of the activity they belong to. Understanding the lifecycle is important for managing resources and handling user interactions properly.

  • onAttach(): Called when the fragment is attached to the activity.
  • onCreate(): Initializes the fragment.
  • onCreateView(): Inflates the fragment's layout.
  • onActivityCreated(): Called when the activity's onCreate() method has been completed.
  • onStart(): Called when the fragment becomes visible to the user.
  • onResume(): Called when the fragment is interacting with the user.
  • onPause(): Called when the fragment is no longer in the foreground.
  • onStop(): Called when the fragment is no longer visible.
  • onDestroyView(): Called when the fragment’s view is being destroyed.
  • onDetach(): Called when the fragment is detached from the activity.

3. Creating a Fragment in Kotlin

To create a fragment in Android, you need to extend the Fragment class and override necessary lifecycle methods like onCreateView() to inflate the fragment's layout.

3.1 Example: Simple Fragment

Let's create a simple fragment that displays a message.

    import android.os.Bundle
    import android.view.LayoutInflater
    import android.view.View
    import android.view.ViewGroup
    import androidx.fragment.app.Fragment
    import android.widget.TextView

    class SimpleFragment : Fragment() {

        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            // Inflate the fragment layout
            val rootView = inflater.inflate(R.layout.fragment_simple, container, false)

            // Find the TextView and set the text
            val textView: TextView = rootView.findViewById(R.id.textView)
            textView.text = "Hello, this is a simple fragment!"

            return rootView
        }
    }
        

In this example, we created a fragment SimpleFragment that inflates a layout and sets text to a TextView.

3.2 Layout for SimpleFragment

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Sample Fragment Text">
        </TextView>

    </LinearLayout>
        

This layout file defines a simple LinearLayout with a TextView to display the fragment's content.

4. Adding Fragment to an Activity

Once the fragment is created, you need to add it to an activity. This is done using FragmentTransaction. You can add a fragment either statically in the XML layout file or dynamically in the activity code.

4.1 Example: Adding Fragment Dynamically

Here's how you can add the fragment to an activity dynamically.

    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    import androidx.fragment.app.FragmentTransaction

    class MainActivity : AppCompatActivity() {

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

            // Add the fragment dynamically
            if (savedInstanceState == null) {
                val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction()
                fragmentTransaction.add(R.id.fragment_container, SimpleFragment())
                fragmentTransaction.commit()
            }
        }
    }
        

In this example, we begin a FragmentTransaction using supportFragmentManager.beginTransaction() and add the SimpleFragment to a container with the ID fragment_container.

4.2 Layout for MainActivity

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <FrameLayout
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        </FrameLayout>

    </RelativeLayout>
        

In the layout file for the activity, we include a FrameLayout with the ID fragment_container where the fragment will be placed.

5. Communication Between Fragments

Fragments can communicate with each other or with their hosting activity. One common way of doing this is by using the ViewModel or by using FragmentTransaction to pass data between fragments.

5.1 Example: Passing Data from Activity to Fragment

    class MainActivity : AppCompatActivity() {

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

            // Pass data to fragment
            val fragment = SimpleFragment()
            val bundle = Bundle()
            bundle.putString("key", "Hello Fragment!")
            fragment.arguments = bundle

            val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction()
            fragmentTransaction.add(R.id.fragment_container, fragment)
            fragmentTransaction.commit()
        }
    }
        

5.2 Retrieving Data in Fragment

    class SimpleFragment : Fragment() {

        override fun onCreateView(
            inflater: LayoutInflater, container: ViewGroup?,
            savedInstanceState: Bundle?
        ): View? {
            val rootView = inflater.inflate(R.layout.fragment_simple, container, false)

            // Retrieve the data passed from the activity
            val message = arguments?.getString("key")
            val textView: TextView = rootView.findViewById(R.id.textView)
            textView.text = message

            return rootView
        }
    }
        

In this example, we pass data (a string) from MainActivity to SimpleFragment using a Bundle. The fragment retrieves the data using arguments?.getString("key") and displays it in a TextView.

6. Conclusion

Fragments are an essential part of Android development, offering a modular way to design UIs that can adapt to different screen sizes. By understanding the fragment lifecycle and how to dynamically add, replace, and communicate between fragments, you can create more efficient and flexible applications. Mastering fragments will help you build powerful Android apps that offer a rich user experience across various device configurations.





Advertisement