Open In App

Dynamic Fragment in Android

Last Updated : 19 Mar, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

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 
   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 
   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
   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 
   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:

Output Screenshot

Messages Fragment

Click on Status Button to load Status Fragment:

Status Fragment

Status Fragment

Click on the Calls Button to load Calls Fragment:

Calls Fragment

Calls Fragment



Like Article
Suggest improvement
Share your thoughts in the comments

Similar Reads