sak
sak

Reputation: 1298

How to use MVVM with any fragment?

I have a TabLayout on a activity and when user clicks on any tab then a fragment is loaded. One of those fragments contains a NavigationView running inside a DrawerLayout. Now the problem is I have to implement MVVM for the whole app and so for the fragments too, I have done this for Activities but I am having trouble while implementing this for Fragments and how to deal with ItemSelected with MVVM and what to bind and how? I am unable to find a proper working sample of the same. Here's the code:

MoreFragment.java:

package com.abc.Fragments;

import android.arch.lifecycle.ViewModel;
import android.arch.lifecycle.ViewModelProviders;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;


import com.abc.MainActivity;
import com.abc.MoreFragmentViewModel;
import com.abc.R;

public class MoreFragment extends Fragment {

    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ViewModel viewModel;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewModel = ViewModelProviders.of(this).get(MoreFragmentViewModel.class);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View fragView =  inflater.inflate(R.layout.fragment_more, container, false);
        return fragView;
    }



    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        mDrawerLayout = getView().findViewById(R.id.drawer_layout);
        mDrawerLayout.openDrawer(Gravity.END);

    }
}

fragment_more.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

    <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="end"
        android:background="@color/grey"
        app:navigationItemSelectedListener="@{()-> viewModel.onMyItemSelected()}"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

</android.support.v4.widget.DrawerLayout>

MoreFragmentViewModel.java:

package com.abc;

import android.arch.lifecycle.ViewModel;
import android.databinding.BaseObservable;

public class MoreFragmentViewModel extends ViewModel {

    public void onMyItemSelected(){
        System.out.print("Item Clicked");
    }
}

Please do any possible help.

Upvotes: 0

Views: 970

Answers (1)

Alex
Alex

Reputation: 972

Use:

DataBindingUtil.inflate(inflater, layoutId(), container, false)

To inflate your layout.

And don't forget to add:

<data>
    <variable
            name="model"
            type="MoreFragmentViewModel"/>
</data>

To your fragment layout.

Upvotes: 1

Related Questions