Thanks for your interest
I have faced some problem while implementing viewpager inside navigation drawer fragment. For example I have a navigation drawer with two fragments fragment1 and fragment2 as shown in the image. When the activity starts fragment1 shows its viewpager fragments fine. But When I go to fragment 2 and come back to fragment1 fragments inside viewpager just dissappears and shows blank. Please suggest some answer if you have any.
Thanks in advance
MainActivity.java
package com.ansoft.shutterbox;
import android.app.Activity;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
public class MainActivity extends FragmentActivity {
public static DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
ArrayList<ListItemData> data;
// nav drawer title
private CharSequence mDrawerTitle;
// used to store app title
private CharSequence mTitle;
// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;
private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
insertData();
mTitle = mDrawerTitle = getTitle();
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
navMenuIcons = getResources()
.obtainTypedArray(R.array.nav_drawer_icons);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.list_slidermenu);
navDrawerItems = new ArrayList<NavDrawerItem>();
// adding nav drawer items to array
// Home
navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
// Find People
navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
// Photos
navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
// Communities, Will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));
// Pages
navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
// What's hot, We will add a counter here
navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1)));
navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1)));
// Recycle the typed array
navMenuIcons.recycle();
mDrawerList.setOnItemClickListener(new SlideMenuClickListener());
// setting the nav drawer list adapter
adapter = new NavDrawerListAdapter(MainActivity.this,navDrawerItems);
mDrawerList.setAdapter(adapter);
mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
R.drawable.ic_drawer, //nav menu toggle icon
R.string.app_name, // nav drawer open - description for accessibility
R.string.app_name // nav drawer close - description for accessibility
) {
public void onDrawerClosed(View view) {
// calling onPrepareOptionsMenu() to show action bar icons
invalidateOptionsMenu();
}
public void onDrawerOpened(View drawerView) {
// calling onPrepareOptionsMenu() to hide action bar icons
invalidateOptionsMenu();
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
if (savedInstanceState == null) {
// on first time display view for first nav item
displayView(0);
}
int width=getResources().getDisplayMetrics().widthPixels/3;
DrawerLayout.LayoutParams params=(android.support.v4.widget.DrawerLayout.LayoutParams)mDrawerList.getLayoutParams();
params.width=width;
mDrawerList.setLayoutParams(params);
}
/**
* Slide menu item click listener
* */
private class SlideMenuClickListener implements
ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
// display view for selected nav drawer item
displayView(position);
}
}
@Override
protected void onResume() {
Toast.makeText(getApplicationContext(), "Resumed", Toast.LENGTH_LONG).show();
super.onResume();
}
/**
* Diplaying fragment view for selected nav drawer list item
* */
private void displayView(int position) {
// update the main content by replacing fragments
Fragment fragment = null;
switch (position) {
case 0:
fragment = new HomeFragment();
break;
case 1:
fragment = new MyProfileFragment();
break;
case 2:
fragment = new EventsFragment();
break;
case 3:
fragment = new TopUpFragment();
break;
case 4:
fragment = new InboxFragment();
break;
case 5:
fragment = new ContactUsFragment();
break;
case 6:
fragment = new SettingsFragment();
break;
default:
break;
}
if (fragment != null) {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.frame_container, fragment).commit();
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
mDrawerList.setSelection(position);
setTitle(navMenuTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
} else {
// error in creating fragment
Log.e("MainActivity", "Error in creating fragment");
}
}
}
Fragment1.java
package com.ansoft.shutterbox.Fragments;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;
import java.util.HashMap;
public class EventsFragment extends Fragment {
public static ViewPager mViewPager;
public EventsFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View cv = inflater.inflate(R.layout.fragment_events, container, false);
InitializeView(cv);
ImageView icDrawer = (ImageView)cv.findViewById(R.id.ic_drawer);
icDrawer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MainActivity.mDrawerLayout.openDrawer(Gravity.LEFT);
}
});
adapter = new TabPagerAdapter(getFragmentManager());
mViewPager.setAdapter(adapter);
tvBacktoList.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ShowNormal();
}
});
mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
switch (position) {
case 0:
tab1.setBackgroundResource(R.drawable.bg_event_selected);
tab2.setBackgroundColor(getResources().getColor(android.R.color.transparent));
imgtab1.setImageResource(R.drawable.ic_list_selected);
imgtab2.setImageResource(R.drawable.ic_calender_default);
tvtab1.setTextColor(getResources().getColor(R.color.colorPrimary));
tvtab2.setTextColor(getResources().getColor(R.color.white));
break;
case 1:
tab2.setBackgroundResource(R.drawable.bg_event_selected);
tab1.setBackgroundColor(getResources().getColor(android.R.color.transparent));
imgtab1.setImageResource(R.drawable.ic_list_default);
imgtab2.setImageResource(R.drawable.ic_calender_selected);
tvtab1.setTextColor(getResources().getColor(R.color.white));
tvtab2.setTextColor(getResources().getColor(R.color.colorPrimary));
break;
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
return cv;
}
class TabPagerAdapter extends FragmentPagerAdapter {
public TabPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new EventListFragment();
case 1:
return new EventCalenderFragment();
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
}
I just solved it by using a simple trick. Inside my TabPagerAdapter
class I used getChildFragmentManager()
instead of getFragmentManager()
. I dont know how that helped, but it did.
A Really good practice gratefull feed, is to always check that viewpager is not empty, or null. With this, see the depth of navigation, within the application, a key within the fragments is context management, in addition to the traditional "this" activity and another is also to manage the instances and instance keys well so that when they are retrieved. The navigation is comfortable for the user, due to the state or place where I left it or navigated previously at the fragments level.
In Main or Fragment
//replace to your inflate code fragment to call viewpager
ViewPager viewPager = findViewById(R.id.viewPager);
if (viewPager != null) {
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
}
If youre use a viepager
pagerAdapter = new ViewPageAdapter(getChildFragmentManager());
Instead of
pagerAdapter = new ViewPageAdapter(getFragmentManager());
When you handle many fragments in menudrawer or material ui and different places remember to use their keys for the instances and save them to call them and recover the previous state.
And inside or outside of viewpager, to this we add a navigation by drawer menu then the handling of instances the depth of the invocation in fragments. It is even more interesting to understand how a well-done code can malfunction if the cycles of the processes are not well managed. Retrieving the instances is the exact step of the implicit in operation.
Happy code!
Usefull link's:
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.