I have activity, and using the button I switch between two fragments (MAIN and SETTINGS). In the MAIN fragment, I have a ViewPager with 4 child fragments.
At first, everything works fine, but if I rotate the screen, the getActivity() fragments for the fragments in the ViewPager return zero.
Activitymain
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Add or show the fragments showHideScreenFragment(FRAGMENT_MAIN); } private void showHideScreenFragment(String tag) { FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); // Get the fragment from the backstack if it is existing BaseFragment oldFragment = getFragmentFromBackstack(tag); // Get the current fragment from the layout BaseFragment currentFragment = getCurrentFragment(); if (oldFragment == null) { if (currentFragment != null) { ft.hide(currentFragment); } ft.add(getMainContainerId(), getFragmentInstance(tag), tag); } else { if (currentFragment != null) { if (isSameFragment(oldFragment, currentFragment)) return; ft.hide(currentFragment); } if (oldFragment.isHidden()) ft.show(oldFragment); } ft.commit(); fm.executePendingTransactions(); } private BaseFragment getFragmentInstance(String tag) { if (tag.equals(FRAGMENT_MAIN)) return getFragmentMain(); if (tag.equals(FRAGMENT_SETTINGS)) return getFragmentSettings(); throw new RuntimeException("Fragment not found !"); } private FragmentMain getFragmentMain() { return new FragmentMain(); } private FragmentSettings getFragmentSettings() { return new FragmentSettings(); } private BaseFragment getFragmentFromBackstack(String tag) { if (tag.equals(FRAGMENT_MAIN)) return getFragmentMainFromBackstack(); if (tag.equals(FRAGMENT_SETTINGS)) return getFragmentSettingsFromBackstack(); throw new RuntimeException("Fragment not found !"); } private FragmentMain getFragmentMainFromBackstack() { return (FragmentMain) getSupportFragmentManager().findFragmentByTag(FRAGMENT_MAIN); } private FragmentSettings getFragmentSettingsFromBackstack() { return (FragmentSettings) getSupportFragmentManager().findFragmentByTag(FRAGMENT_SETTINGS); } private boolean isSameFragment(Fragment f1, Fragment f2) { return f1.getTag().equals(f2.getTag()); }
Fragmentmentmain
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_main, container, false); viewPager = (ViewPager) view.findViewById(R.id.viewPager); // Add the 4 child fragments to the viewpager populateViewPager(); // Debugging new Handler().postDelayed(new Runnable() { @Override public void run() { _printFragmentStates(); } }, 2500); return view; } private void populateViewPager() { ArrayList<BaseMainFragment> fragments = new ArrayList<BaseMainFragment>(); fragments.add(new FragmentSearch()); fragments.add(new FragmentFavorites()); fragments.add(new FragmentHouse()); fragments.add(new FragmentRoom()); adapterMain = new AdapterMain(getChildFragmentManager(), fragments); viewPager.setOffscreenPageLimit(4); viewPager.setAdapter(adapterMain); } // DEBUGGING private void _printFragmentStates() { Activity actSearch = null; Activity actFav = null; Activity actHouse = null; Activity actRoom = null; actSearch = getFragmentSearch().getActivity(); actFav = getFragmentFavorites().getActivity(); actHouse = getFragmentHouse().getActivity(); actRoom = getFragmentRoom().getActivity(); Functions.logd("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Functions.logd("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Functions.logd("Main fragment act, is null: " + (getActivity() == null)); Functions.logd("Search act, is null: " + (actSearch == null)); Functions.logd("Favorite act, is null: " + (actFav == null)); Functions.logd("House act, is null: " + (actHouse == null)); Functions.logd("Room act, is null: " + (actRoom == null)); Functions.logd("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); Functions.logd("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"); } private FragmentSearch getFragmentSearch() { return (FragmentSearch) adapterMain.getItem(0); } private FragmentFavorite getFragmentFavorite() { return (FragmentFavorite) adapterMain.getItem(1); } private FragmentHouse getFragmentHouse() { return (FragmentHouse) adapterMain.getItem(2); } private FragmentRoom getFragmentHouse() { return (FragmentRoom) adapterMain.getItem(3); }
As I said, at first everything works fine, but after turning the screen I get null for getActivity(); in 4 child fragments: search, favorites, home and room.
Debug Logcat
1 launch:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Main fragment act, is null: false Search act, is null: false Favorite act, is null: false House act, is null: false Room act, is null: false ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
After changing the screen orientation:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Main fragment act, is null: false Search act, is null: true Favorite act, is null: true House act, is null: true Room act, is null: true ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
What am I doing wrong?