I have a main Activity with a fragment container. In this container I place a fragment with 2 more fragments in the form of Tabs (2 tabs). If you log into the application (authorization through Facebook) and immediately use Fragment with Tabs, the application crashes on the line at com.app.pollee.fragments.TopFragment.initTabs (TopFragment.java:107) When you re- enter the application, everything works fine!
java.lang.IllegalStateException: Activity has been destroyed at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1470) at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634) at android.support.v4.app.BackStackRecord.commitAllowingStateLoss(BackStackRecord.java:617) at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:139) at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:420) at com.app.pollee.fragments.TopFragment.initTabs(TopFragment.java:107) at com.app.pollee.fragments.TopFragment.access$000(TopFragment.java:25) at com.app.pollee.fragments.TopFragment$1.requestSuccess(TopFragment.java:83) at com.app.pollee.managers.ServerRequestManager$7.onResponse(ServerRequestManager.java:168) at com.app.pollee.managers.ServerRequestManager$7.onResponse(ServerRequestManager.java:150) at com.android.volley.toolbox.JsonRequest.deliverResponse(JsonRequest.java:72) at com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5294) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) A fragment that is placed in the container of activity
public class TopFragment extends Fragment { private View view; private Context fragmentContext; private FragmentActivity fragmentActivity; private static TopFragment fragment; //Синглтон public static TopFragment getInstance(){ if (fragment==null) { fragment = new TopFragment(); } return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (view==null) { view = inflater.inflate(R.layout.fragment_top, container, false); } fragmentContext = getActivity(); fragmentActivity = (FragmentActivity) getActivity(); initTabs(); return view; } private void initTabs() { ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewPager); TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabLayout); TabsPagerFragmentAdapter adapter = new TabsPagerFragmentAdapter(fragmentActivity.getSupportFragmentManager(), fragmentContext); viewPager.setAdapter(adapter); tabLayout.setupWithViewPager(viewPager); } } Tab adapter
public class TabsPagerFragmentAdapter extends FragmentPagerAdapter { private String[] tabs; public TabsPagerFragmentAdapter(FragmentManager fm, Context context) { super(fm); tabs = context.getResources().getStringArray(R.array.tab_top_array); } @Override public CharSequence getPageTitle(int position) { return tabs[position]; } @Override public Fragment getItem(int position) { switch (position){ case 0: FirstTopTabsFragment fist = new FirstTopTabsFragment(); return fist; case 1: SecondTopTabsFragment second = new SecondTopTabsFragment(); return second; } return null; } @Override public int getCount() { return tabs.length; } }
fragmentActivity.getSupportFragmentManager()takegetChildFragmentManager()? In general, putting a fragment into a fragment is a bad idea. Better ViewPager in a separate activation show. - Yuriy SPb ♦