Dynamic Fragment in Android
Last Updated : 28 Apr, 2025
Dynamic Fragment is a type of fragment that is defined in an XML layout file and called using FragmentManager class. The FragmentManager class is responsible for managing fragments. It is a part of the Activity and its lifecycle depends on the lifecycle of its container activity. Dynamic Fragments are more responsive and flexible than Static Fragments.
Properties of Dynamic Fragment:
- Defined in Java class by extending FragmentManager class.
- Having a fixed position in the Activity's layout but its content can be changed.
- Can be added, removed, or replaced at runtime.
- Created when the Activity is created and destroyed when the activity is destroyed.
Step by Step Implementation
Step 1: Create a New Project in Android Studio
To create a new project in Android Studio please refer to How to Create/Start a New Project in Android Studio. Note that select Java as the programming language.
Step 2: Working with the activity_main.xml file
Navigate to the app > res > layout > activity_main.xml and add the below code to that file. Below is the code for the activity_main.xml file. Comments are added inside the code to understand the code in more detail.
XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout 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:orientation="vertical" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#BDBDBD" android:padding="15dp" android:weightSum="3"> <Button android:id="@+id/btnMessages" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Messages" android:layout_marginRight="5dp"/> <Button android:id="@+id/btnStatus" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="5dp" android:text="Status" /> <Button android:id="@+id/btnCalls" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Calls" /> </LinearLayout> <FrameLayout android:id="@+id/FL" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
Step 3: Working with Activity file (e.g. MainActivity.java)
Here we call fragments using FragmentManager class in Frame Layout.
Java package com.anas.dynamicfragment; import androidx.appcompat.app.AppCompatActivity; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentTransaction; import android.annotation.SuppressLint; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; // contains dynamic frag + backstack // of frags + data passing in frags public class MainActivity extends AppCompatActivity { String Root_Frag = "root_fagment"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btnMessages, btnStatus, btnCalls; btnMessages = findViewById(R.id.btnMessages); btnStatus = findViewById(R.id.btnStatus); btnCalls = findViewById(R.id.btnCalls); // default frag loadFrag(new MessagesFragment(), 0); btnMessages.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadFrag(new MessagesFragment(), 0); } }); btnStatus.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadFrag(new StatusFragment(), 1); } }); btnCalls.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { loadFrag(new CallsFragment(), 1); } }); } // flag 0 for add, 1 for replace public void loadFrag(Fragment fragment_name, int flag) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); if (flag == 0) { ft.add(R.id.FL, fragment_name); fm.popBackStack(Root_Frag, FragmentManager.POP_BACK_STACK_INCLUSIVE); ft.addToBackStack(Root_Frag); } else { ft.replace(R.id.FL, fragment_name); ft.addToBackStack(null); } ft.commit(); } }
Step 4: Working with Fragment layout (e.g. fragment_messages.xml)
XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f0f4c3" android:gravity="center" tools:context=".MessagesFragment"> <TextView android:id="@+id/txtMessagesFrag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Messages Fragment" android:textSize="22sp" android:textColor="#cddc39" android:textStyle="italic|bold"/> </LinearLayout>
Step 5: Working with Fragment layout (e.g. fragment_status.xml)
XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#b2ebf2" android:gravity="center" tools:context=".StatusFragment"> <TextView android:id="@+id/txtUpperFrag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Status Fragment" android:textSize="22sp" android:textColor="#00bcd4" android:textStyle="italic|bold"/> </LinearLayout>
Step 6: Working with Fragment layout (e.g. fragment_calls.xml)
XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#f8bbd0" android:gravity="center" tools:context=".CallsFragment"> <TextView android:id="@+id/txtUpperFrag" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Calls Fragment" android:textSize="22sp" android:textColor="#e91e63" android:textStyle="italic|bold"/> </LinearLayout>
Step 7: Working with Fragment (e.g. MessagesFragment.java)
Java package com.anas.dynamicfragment; import android.annotation.SuppressLint; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; public class MessagesFragment extends Fragment { public MessagesFragment() { // Required empty public constructor } @SuppressLint("LongLogTag") @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_messages, container, false); return view; } }
Step 8: Working with Fragment (e.g. StatusFragment.java)
Java package com.anas.dynamicfragment; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class StatusFragment extends Fragment { public StatusFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_status, container, false); return view; } }
Step 9: Working with Fragment (e.g. CallsFragment.java)
Java package com.anas.dynamicfragment; import android.os.Bundle; import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class CallsFragment extends Fragment { public CallsFragment() { // Required empty public constructor } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_calls, container, false); return view; } }
Output:
Click on the Messages Button to load Messages Fragment:
Messages Fragment Click on Status Button to load Status Fragment:
Status Fragment Click on the Calls Button to load Calls Fragment:
Calls Fragment