androidxmlandroid-layoutandroid-fragmentsmaterialdrawer

Fragment not loading when selected from MaterialDrawer


I have an activity which has a MaterialDrawer created. The material Drawer code is as follows

    SecondaryDrawerItem item1 = new SecondaryDrawerItem().withIdentifier(1).withName(R.string.drawer_item_home)
            .withIcon(new IconicsDrawable(this)
                    .icon(GoogleMaterial.Icon.gmd_home)
                    .sizeRes(R.dimen.activity_horizontal_margin));
    SecondaryDrawerItem item2 = new SecondaryDrawerItem().withIdentifier(2).withName(R.string.drawer_item_graph)
            .withIcon(new IconicsDrawable(this)
                    .icon(GoogleMaterial.Icon.gmd_trending_up)
                    .sizeRes(R.dimen.activity_horizontal_margin));
    SecondaryDrawerItem item3 = new SecondaryDrawerItem().withIdentifier(3).withName(R.string.drawer_item_map)
            .withIcon(new IconicsDrawable(this)
                    .icon(GoogleMaterial.Icon.gmd_map)
                    .sizeRes(R.dimen.activity_horizontal_margin));
    SecondaryDrawerItem item4 = new SecondaryDrawerItem().withIdentifier(4).withName(R.string.drawer_item_settings)
            .withIcon(new IconicsDrawable(this)
                    .icon(GoogleMaterial.Icon.gmd_settings)
                    .sizeRes(R.dimen.activity_horizontal_margin))
            .withSelectable(false);
    new DrawerBuilder()
            .withActivity(this)
            .withToolbar(getToolbar())
            .withSelectedItem(1)
            .withAccountHeader(headerResult)
            .withActionBarDrawerToggleAnimated(true)
            .addDrawerItems(
                    item1,
                    item2,
                    item3,
                    new DividerDrawerItem(),
                    item4
            )
            .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
                @Override
                public boolean onItemClick(View view, int position, IDrawerItem drawerItem) {
                    // do something with the clicked item :D
                    if (drawerItem != null) {
                        if (drawerItem.getIdentifier() == 1) {
                            getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.fragment, new WeatherFragment())
                                    .commit();
                        }
                        else if (drawerItem.getIdentifier() == 2) {
                            getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.fragment, new GraphsFragment())
                                    .commit();
                        }
                        else if (drawerItem.getIdentifier() == 3) {
                            getSupportFragmentManager().beginTransaction()
                                    .replace(R.id.fragment, new MapsFragment())
                                    .commit();
                        }
                        else if (drawerItem.getIdentifier() == 4) {
                            startActivity(new Intent(WeatherActivity.this, AboutActivity.class));
                        }
                    }
                    return false;
                }
            })
            .build();

When my app starts, the default option selected is 1, ie. the activity automatically loads WeatherFragment when the App is started. The problem occurs when I click on the Second item in the list : Graphs Fragment. According to the code, it should have worked, but what it does is it retains the old fragment in view, and does not load the layout of the new Fragment.

Here is the Activity XML Layout:

<android.support.design.widget.CoordinatorLayout 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:background="@color/colorPrimary"
tools:context="com.a5corp.weather.activity.WeatherActivity">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.NoActionBar.AppBarOverlay">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.NoActionBar.PopupOverlay" />

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_weather" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    app:srcCompat="@drawable/ic_search_white_24dp" />

</android.support.design.widget.CoordinatorLayout>

content_weather.xml :

<fragment 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:id="@+id/fragment"
android:name="com.a5corp.weather.fragment.WeatherFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:layout="@layout/fragment_weather" />

Until now, what is clear is that WeatherActivity will always load fragment_weather (WeatherFragment) as such. But when I click on the GraphsFragment (second item), it does not load that layout

Here is my GraphsFragment code:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    Log.i("Loaded" , "Fragment");     //This Log info shows up in the Android Logger
    rootView = inflater.inflate(R.layout.fragment_graphs, container, false);

    return rootView;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MaterialDialog.Builder builder = new MaterialDialog.Builder(this.getActivity())
            .title("Please Wait")
            .content("Loading")
            .progress(true , 0);
    builder.build().show();
}

fragment_graphs.xml :

<android.support.v4.widget.SwipeRefreshLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="111dp"
        android:text="Button"/>

    <Switch
        android:id="@+id/switch1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignStart="@+id/button2"
        android:layout_below="@+id/button2"
        android:layout_marginTop="40dp"
        android:text="Switch"/>

</RelativeLayout>
</android.support.v4.widget.SwipeRefreshLayout>

The progress dialog shows as such, but the layout items like the button and the switch from GraphsFragment XML do not load.

How will I load the GraphsFragment when clicked from the Drawer, along with the layout inflated and the progress dialog shown


Solution

  • Turns out I only needed to add a FrameLayout instead of includeing the layout.

    Here is the modified main XML file

    <android.support.design.widget.CoordinatorLayout 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:background="@color/colorPrimary"
        tools:context="com.a5corp.weather.activity.WeatherActivity">
    
        <android.support.design.widget.AppBarLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/appBar"
            android:theme="@style/AppTheme.NoActionBar.AppBarOverlay">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.NoActionBar.PopupOverlay" />
    
        </android.support.design.widget.AppBarLayout>
    
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            android:id="@+id/fragment"
            android:paddingTop="?attr/actionBarSize"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context="com.a5corp.weather.WeatherActivity"
            tools:ignore="MergeRootFrame"
            android:background="@color/colorPrimary" />
    
    </android.support.design.widget.CoordinatorLayout>