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 fragspublic 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:
Messages Fragment
Click on Status Button to load Status Fragment:
Status Fragment
Click on the Calls Button to load Calls Fragment:
Calls Fragment
