Java – Strange fragment lifecycle behavior: onCreate called twice

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).

Related Problems and Solutions