Skip to content

Android Fragments

Fragments are like activities but they have to be hosted inside an Activity. The fragments contains a layout file and backing .cs file. In addition to the Activity life cycle methods, Fragments have their own life cycle methods.

Fragments can be swapped during runtime, this enables creating dynamic UIs. The fragment class inherits from Fragment.

Fragment in different Android namespace

Please not that when using the support libraries you will need to use the Fragment from the support libraries, Android.Support.V4.App.Fragment not the one from Android.App.Fragment

Create fragment

From Visual Studio add new File and choose Fragment. Visual Studio will create the following for you:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
public class CoursesFragment : Android.Support.V4.App.Fragment
{
    public override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);

        // Create your fragment here
    }

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        // Use this to return your custom view for this Fragment
        // return inflater.Inflate(Resource.Layout.YourFragment, container, false);

        return base.OnCreateView(inflater, container, savedInstanceState);
    }
}

Create the layout file

Create the layout file inside the Resources -> layout.

Naming layout files

You should adopt a convention for naming layout files. For layouts used in fragments, you should prefix them with fragment_<name_of_fragment>, e.g a fragment called CoursesFragment tha layout file should be fragment_courses.axml.

Attach the layout to the fragment

The fragment uses a different method to set the content UI. The OnCreateView() method is used set the content view for the fragment.

Uncomment the line or add a new line to inflate the layout file as follows:

1
var fragmentView = inflater.Inflate(Resource.Layout.fragment_courses, container, false);

The complete method will be as follows:

1
2
3
4
5
6
7
public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    base.OnCreateView(inflater, container, savedInstanceState);
    // Use this to return your custom view for this Fragment
    var fragmentView = inflater.Inflate(Resource.Layout.fragment_courses, container, false);
    return fragmentView;
}

Attach the fragment statically in the activity

They are two ways to attach the fragment in the Activity. You can statically attach the fragment in the Activity's xml file or dynamically add it in code.

Statically attached fragment cannot be changed

When you statically attach the fragment in the Activity's xml file, you can not later swap out the fragment.

Add the fragment in the xml file

You should add the fragment in the xml file of the activity as follows:

1
2
3
4
5
<fragment
    android:id="@+id/fragment"
    class="Challenge01.CoursesFragment"
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" />

The fragment tag is used to attach the fragment in the xml file. The class attribute should be the fully qualified name of the class for the fragment. The android:id is required attribute when using fragments in the xml file.

Dynamically attach the fragment

You can add or remove a fragment dynamically to a container in the xml file. First define a ui with and android:id to be used to add the fragment. A FrameLayout is generally used but you can use an type of container.

Create the xml tag

Add the xml tag to be used to show the contents of the fragment in the activity layout file as follows:

1
2
3
4
<FrameLayout 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" />

Add the fragment in code

In the OnCerate() method of the activity dynamically add the fragment using the SupportFragmentManager as follows:

1
2
3
4
5
6
var fragment = new CoursesFragment();

SupportFragmentManager // Get the support fragment manager instead of the FragmentManager
    .BeginTransaction() // Start a transaction
    .Add(Resource.Id.container, fragment, "coursesFragment") // Add the fragment
    .Commit(); // Commit the changes

Which fragment manager to use?

When using the fragments from the support library, Android.Support.V4.App.Fragment, you should use the SupportFragmentManager property and when using the fragments from Android.App.Fragment, you should use the the FragmentManager.

You can perform multiple fragment operations by using transactions. Whe you are done you call the Commit() method to apply the changes.