Luca
Luca

Reputation: 833

Add navigation drawer on fragment

I have an application with an activity that contains a left-side navigation drawer. This activity also loads dynamically different fragments.

Now the point is: I want to attach to each fragment a different right-side drawer (to implement some filters), attached on fragment load.

I've tried to copy and re-use navigationDrawer.setUp(int fragmentId, DrawerLayout drawerLayout) code in MyFragment.onAttach(...) method, but I get a NullPointerException with mFragmentContainerView = getActivity().findViewById(R.id.filter_drawer); (I think getActivity().findViewById(...) can't find anything).

Here is the code copied from auto-generated NavigationDrawerFragment that I put in my CustomerFragment:

mFragmentContainerView = getActivity().findViewById(R.id.filter_drawer);
mDrawerLayout = (DrawerLayout) activity.findViewById(R.id.drawer_layout);

// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

mDrawerToggle = new ActionBarDrawerToggle(
    getActivity(),                    /* host Activity */
    mDrawerLayout,                    /* DrawerLayout object */
    R.drawable.ic_drawer,             /* nav drawer image to replace 'Up' caret */
    R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
    R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
) {
@Override
public void onDrawerClosed(View drawerView) {
    super.onDrawerClosed(drawerView);
    if (!isAdded()) {
        return;
    }

    getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}

@Override
public void onDrawerOpened(View drawerView) {
    super.onDrawerOpened(drawerView);
    if (!isAdded()) {
        return;
    }

    if (!mUserLearnedDrawer) {
        // The user manually opened the drawer; store this flag to prevent auto-showing
        // the navigation drawer automatically in the future.
        mUserLearnedDrawer = true;
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
        sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
    }

    getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};

// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
    mDrawerLayout.openDrawer(mFragmentContainerView);
}

// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
    @Override
    public void run() {
        mDrawerToggle.syncState();
    }
});

mDrawerLayout.setDrawerListener(mDrawerToggle);

I've searched the web for a solution, but everyone does the opposite of what i want: "manage fragment via navigation drawer" and I want "custom navigation drawer on fragment".

How can I achieve this?

Upvotes: 0

Views: 1348

Answers (2)

vivek bhardwaj
vivek bhardwaj

Reputation: 236

see this code i have used intent instead of fragment

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    private LinearLayout mDrawer1;
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

    Fragment[] allFrgaments;
    public int curFrag = -1;
    FragmentTransaction ft;
    FragmentManager fm;
    ImageView ivtophomeslide;

    Activity activity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.slidingmenu);
        activity = MainActivity.this;

        allFrgaments = new Fragment[] { new HomeFragment(),
                new AccountFragment(), new SavedLocationFragment(),
                new BecomeDriverFragment(), new InviteFragment(),
                new DiscountFragment(), new RecentTripsFragment() };

        mTitle = mDrawerTitle = getTitle();

        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);
        mDrawer1 = (LinearLayout) findViewById(R.id.drawer1);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons
                .getResourceId(0, -1)));

        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons
                .getResourceId(1, -1)));

        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons
                .getResourceId(2, -1)));

        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons
                .getResourceId(3, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons
                .getResourceId(4, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons
                .getResourceId(5, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons
                .getResourceId(6, -1)));
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[7], navMenuIcons
                .getResourceId(7, -1)));

        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        // getActionBar().setHomeButtonEnabled(true);
        getActionBar().setBackgroundDrawable(
                new ColorDrawable(getResources().getColor(R.color.light_blue)));
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.menu_m, R.string.app_name,

                R.string.app_name) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);

                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);

                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {

            displayView(0);
        }
    }

    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            displayView(position);

        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return false;

    }

    public void switchFrag(int position, Activity act) {
        try {
            Log.e("tag", "clicked" + position);
            Log.e("tag", "current :-" + curFrag);
            if (curFrag != position) {
                curFrag = position;
                ft = act.getFragmentManager().beginTransaction();
                ft.replace(R.id.frame_container, allFrgaments[position], ""
                        + position);
                ft.commit();
                displayView(position);
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                mDrawerLayout.closeDrawer(mDrawer1);
                setTitle(navMenuTitles[position]);
            } else {
                Log.e("test", "else part fragment ");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void displayView(int position) {

        switch (position) {
        case 0:

            switchFrag(0, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 1:

            switchFrag(1, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 2:

            switchFrag(2, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 3:

            switchFrag(3, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;

        case 4:

            switchFrag(4, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 5:
            switchFrag(5, activity);
            mDrawerLayout.closeDrawer(mDrawer1);
            break;
        case 6:
            switchFrag(6, activity);
            mDrawerLayout.closeDrawer(mDrawer1);
            break;
        case 7:
            Intent intent = new Intent(this, MainActivityy.class);
            startActivity(intent);
            // switchFrag(7, activity);
            mDrawerLayout.closeDrawer(mDrawer1);
            break;

        default:
            break;
        }

    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        mDrawerToggle.onConfigurationChanged(newConfig);
    }
}

Upvotes: 4

vivek bhardwaj
vivek bhardwaj

Reputation: 236

you can do this by deleting your fragment class and in navigation drawer where you are closing your drawer you can simply add explicit intent to call another class of navigation drawer

Upvotes: 1

Related Questions