Strange fragment lifecycle behavior: onCreate called twice… here is a solution to the problem.
Strange fragment lifecycle behavior: onCreate called twice
I created a simple fragment.
fragment class
public class MyFragment extends Fragment {
static int count = 0;
static TextView tv;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.i("TEST", "oncreate");
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag, container, false);
tv = (TextView) view.findViewById(R.id.tv);
return view;
}
public static TextView setMyText(String text) {
tv.setText(text);
return tv;
}
}
The problem is that the onCreate fragment is called twice (when the activity is first started). Anyone know why? In fact, each lifecycle method is called twice (onAttach, onResume..). If anyone is wondering, I didn’t rotate the screen or anything else. Is this a common case or am I doing something wrong here?
Activity lessons
public class MainActivity extends FragmentActivity {
private static int COUNT = 0;
private static int COUNT2 = 5;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view_pager);
ViewPager vp = (ViewPager) findViewById(R.id.vp);
vp.setAdapter(new MyAdapter(getSupportFragmentManager()));
vp.setOnPageChangeListener(new CustomPageListener());
}
private static class MyAdapter extends FragmentStatePagerAdapter {
public MyAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
MyFragment mf = new MyFragment();
return mf;
}
@Override
public int getCount() {
return 5;
}
}
private class CustomPageListener extends ViewPager.SimpleOnPageChangeListener {
@Override
public void onPageSelected(int position) {
MyFragment.setMyText("This is page "+position);
}
}
}
Solution
By default, the FragmentStatePagerAdapter
instantiates two pages for ViewPager. onCreate is called twice, once for each fragment returned by public Fragment getItem(int position).