android-fragments android-viewpager android-nested-fragment

android fragments - getChildFragmentManager() y viewpager



android-fragments android-viewpager (1)

Tengo el mismo problema que Navegar de regreso a FragmentPagerAdapter -> los fragmentos están vacíos pero me gustaría alguna aclaración sobre la solución de usar getChildFragmentManager ().

Esta solución usa getChildFragmentManager (), el administrador de fragmentos dentro de este Fragment (OuterFragment, que tiene el viewpager). InnerFragment es una página dentro de OuterFragment. Cuando alguien hace clic en la vista de lista en InnerFragment, quiero que InnerFragment2 reemplace InnerFragment. ¿Cómo se ven los gerentes xml y de fragmentos?

fragment_outer.xml:

<?xml version="1.0" encoding="utf-8"?> <android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/vpPager" android:layout_height="wrap_content" android:layout_width="match_parent"> <android.support.v4.view.PagerTabStrip android:id="@+id/pager_header" android:layout_gravity="top" android:layout_height="wrap_content" android:layout_width="match_parent" android:paddingBottom="4dp" android:paddingTop="4dp" /> <FrameLayout android:id="@+id/inner_content" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.view.ViewPager>

OuterFragment.java:

@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_outer, container, false); vpPager = (ViewPager) v.findViewById(R.id.vpPager); FragmentManager cfManager = getChildFragmentManager(); adapterViewPager = new MyPagerAdapter(cfManager); vpPager.setAdapter(adapterViewPager); return v; } public static class MyPagerAdapter extends FragmentPagerAdapter { public MyPagerAdapter(FragmentManager fragmentManager) { super(fragmentManager); } @Override public int getCount() { return 2; } // Returns the fragment to display for that page @Override public Fragment getItem(int position) { switch (position) { case 0: return InnerFragment.newInstance(false); case 1: return InnerFragment.newInstance(true); default: return null; } }

InnerFragment aparece como un fragmento dentro de OuterFragment, que tiene el viewpager. InnerFragment tiene una vista de lista que, al hacer clic, debe reemplazar a InnerFragment con InnerFragment2.

InnerFragment.java:

FragmentManager fm = getChildFragmentManager(); fm = fm.beginTransaction(); ft.addToBackStack(null); ft = ft.replace(R.id.inner_content, InnerFragment2.newInstance(someArg)); ft.commit();

Esto arroja un error al decir que InnerFragment2 no reconoce la vista R.id.inner_content.

No solo InnerFragment2 debe reemplazar a InnerFragment, sino que cuando se muestra InnerFragment2 y se hace clic en su botón, quiero que InnerFragment2 se sustituya por InnerFragment3. Básicamente quiero usar inner_content como un contenedor interno y sigo agregando fragmentos a un backstack para un comportamiento adecuado de la espalda.

¿Obtiene getFragmentManager () o getFragmentManager () cada vez que agrego a mi fragmento de backstack, qué aspecto tiene el patrón xml, porque no tengo un framelayout en mi defecto?


public void setupViewPager(ViewPager viewPager) { FragmentManager cfManager=getChildFragmentManager(); viewPagerAdapter = new ViewPagerAdapter(cfManager); // viewPagerAdapter = new ViewPagerAdapter(getActivity().getSupportFragmentManager()); viewPagerAdapter.addFragment(new EntertainmentWallpaperFragment(), getString(R.string.title_entertainment_wallpapers)); viewPagerAdapter.addFragment(new EntertainmentMusicFragment(), getString(R.string.title_entertainment_music)); viewPagerAdapter.addFragment(new EntertainmentGamesFragment(), getString(R.string.title_entertainment_games)); viewPagerAdapter.addFragment(new EntertainmentEBooksFragment(), getString(R.string.title_entertainment_ebooks)); viewPagerAdapter.addFragment(new EntertainmentAppsFragment(), getString(R.string.title_entertainment_apps)); viewPager.setAdapter(viewPagerAdapter); }

Espero que esto ayude. Tuve el mismo problema donde los fragmentos aparecen, pero una vez que vuelves, desaparecen y encuentran un fragente vacío. Comuniqué la línea que había implementado por primera vez, y luego de actualizar el administrador de fragmentos, pude disfrutar de desplazamiento suave sin inconvenientes.