Adding Fragments Dynamically In Android Application

In this article, you will see how to add a fragment dynamically at run time.

Overview

I have discussed how to add a fragment statically in my last article. To start development of Android Applications, some useful links are given below:

  1. Android Programming - Day One
  2. Android Programming - Day Two
  3. How To Display A Dialog Windows In Android
  4. How To Display A Progress Dialog Window In Android
  5. Intent In Android
  6. Return Data Using Intent Object In Android Applications
  7. Passing Data Using An Intent Object In Android Applications
  8. Fragments In Android Applications

Introduction

In this article, you will see how to add a fragment dynamically at run time. We can compartmentalize our UI into the various configurable parts, using a fragment. But the real power of fragments is realized when you add them dynamically to an activities during runtime. In the article Fragments In Android Applications , you have seen, how you can add the fragments to an activity by modifying XML files during  design time. It is more useful when you create the fragments and add them to the activities during runtime.

This enables you to create a customizable user interface for your Application. E.g. if the Application is running on a smartphone, you might fill an activity with a single fragment, but if the same Application is running on a tablet, you might fill the activity with two or more fragments, as the tablet has more screen size, compared to a smartphone.

Code

  1. package com.example.administrator.myfragmentapp;  
  2. import android.app.FragmentManager;  
  3. import android.app.FragmentTransaction;  
  4. import android.support.v7.app.ActionBarActivity;  
  5. import android.os.Bundle;  
  6. import android.view.Display;  
  7. import android.view.Menu;  
  8. import android.view.MenuItem;  
  9. import android.view.WindowManager;  
  10. public class MainActivity extends ActionBarActivity   
  11. {  
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState)   
  14.     {  
  15.         super.onCreate(savedInstanceState);  
  16.         //setContentView(R.layout.activity_main);  
  17.         FragmentManager fragmentManager = getFragmentManager();  
  18.         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  
  19.         //get the current device information  
  20.         WindowManager windowManager = getWindowManager();  
  21.         Display display = windowManager.getDefaultDisplay();  
  22.         if (display.getWidth() > display.getHeight()) {  
  23.             //This is landscape mode  
  24.             Fragment1Activity fragment1Activity1 = new Fragment1Activity();  
  25.             //android.R.id.content refers to the content view of the activity  
  26.             fragmentTransaction.replace(android.R.id.content, fragment1Activity1);  
  27.         } else {  
  28.             //This is portrait mode  
  29.             Fragment2Activity fragment2Activity = new Fragment2Activity();  
  30.             fragmentTransaction.replace(android.R.id.content, fragment2Activity);  
  31.         }  
  32.         fragmentTransaction.commit();  
  33.     }  
  34.     @Override  
  35.     public boolean onCreateOptionsMenu(Menu menu) {  
  36.         // Inflate the menu; this adds items to the action bar if it is present.  
  37.         getMenuInflater().inflate(R.menu.menu_main, menu);  
  38.         return true;  
  39.     }  
  40.     @Override  
  41.     public boolean onOptionsItemSelected(MenuItem item) {  
  42.         // Handle action bar item clicks here. The action bar will  
  43.         // automatically handle clicks on the Home/Up button, so long  
  44.         // as you specify a parent activity in AndroidManifest.xml.  
  45.         int id = item.getItemId();  
  46.         //noinspection SimplifiableIfStatement  
  47.         if (id == R.id.action_settings) {  
  48.             return true;  
  49.         }  
  50.         return super.onOptionsItemSelected(item);  
  51.     }  
  52. }  
Result

Run the Application by clicking F11 on the Android emulator. By default, the Android emulator is in the portrait mode.

Result

Now, change the orientation of the emulator from the portrait to the landscape by clicking the button <Ctrl> + F11.

Result

Explanation

To add the fragments to an activity, you use the FragmentManager class by first obtaining an instance of it.
  1. FragmentManager fragmentManager=getFragmentManager();  
FragmentTransaction class is used to perform the fragment transaction in your activity for either adding, removing or replacing.
  1. FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();   
In the code, given above, WindowManager is used to determine whether the device in currently in the portrait mode or landscape mode.

Once, it is determined, you add the appropriate fragment to the activity by creating the fragment and after the call, the replace() method of the FragmentTransaction object needs to be used. This adds the fragment to the specified view container.

Here, Android.R.id.content refers to the content view of the activity.
  1. //This is landscape mode  
  2. Fragment1Activity fragment1Activity1 = new Fragment1Activity();  
  3. //android.R.id.content refers to the content view of the activity  
  4. fragmentTransaction.replace(android.R.id.content, fragment1Activity1);  
Using the replace() method is essentially the same as calling the remove() method, followed by the add() method of the FragmentTransaction object. To ensure the changes take effect, you need to call the commit() method.

fragmentTransaction.commit();

Conclusion

In the above article, we saw, how to add the fragment dynamically. In the next article, I will explain about the complete life cycle of a fragment.