Reputation: 833
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
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
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