android - studio - ¿Por qué no es posible usar ViewPager dentro de un Fragmento? En realidad es
viewpager android example (4)
Al inicializar el SetionPageAdapter para ViewPager use "getChildFragmentManager ()".
mSectionsPagerAdapter = new SectionsPagerAdapter (getChildFragmentManager ());
Hay información de que es imposible usar ViewPager
dentro de un Fragment
en muchas fuentes como " La Guía de codificadores ocupados para desarrolladores de Android " por Mark Murphy, o publicaciones como this en SO. Estoy confundido porque no tengo ese problema y utilizo ViewPager
éxito dentro de mi Fragment
. La única distinción es que instancia un ViewPager
no está en el método onCreateView()
pero en onActivityCreated()
. Y todo funciona perfectamente bien.
Entonces, la pregunta es: ¿podría ser que simplemente no sé algo y no se recomienda por alguna razón hacer instancias de UI en onActivityCreated()
? Pero de nuevo, todo funciona bien.
Aquí está el listado de la clase y xml:
Clase:
public class ViewPagerFragment extends Fragment {
static final int NUM_ITEMS = 2;
private ViewPagerAdapter mAdapter;
private ViewPager mPager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.view_pager_fragment, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new ViewPagerAdapter(getFragmentManager());
mPager = (ViewPager) getView().findViewById(R.id.pager);
mPager.setAdapter(mAdapter);
}
public static class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int num) {
if (num == 0) {
return new ItemsListFragment();
} else {
return new FavsListFragment();
}
}
@Override
public int getCount() {
return NUM_ITEMS;
}
}
}
Diseño:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
</LinearLayout>
Para implementar el Buscador de vistas dentro de un fragmento, use getChildFragmentManager () en lugar de getFragmentManager () . Puede llamar a setAdapter () para ViewPager desde onCreateView () o onActivityCreated () , eso no es una cuestión.
Espero que esto los ayude chicos.
es posible intentar hacer este código y guardar view_pager_fragment.xml
<android.support.design.widget.AppBarLayout
android:id="@+id/appBarLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
<android.support.design.widget.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
ViewPagerFragment
ViewPager viewPager;
TabLayout tabLayout;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tracks, container, false);
viewPager = (ViewPager) view.findViewById(R.id.viewpager);
tabLayout = (TabLayout) view.findViewById(R.id.tab);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setupViewPager(viewPager);
tabLayout.setupWithViewPager(viewPager);
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
private void setupViewPager(ViewPager viewPager) {
ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager());``
viewPagerAdapter.addFragment(new FirstFragment(), "First");
viewPagerAdapter.addFragment(new SecoundFragment(), "Secound");
viewPagerAdapter.addFragment(new LoginFragment(), "Login");
viewPager.setAdapter(viewPagerAdapter);
}
private class ViewPagerAdapter extends FragmentPagerAdapter {
List<Fragment> fragmentList = new ArrayList<>();
List<String> fragmentTitles = new ArrayList<>();
public ViewPagerAdapter(FragmentManager fragmentManager) {
super(fragmentManager);
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position) {
return fragmentTitles.get(position);
}
public void addFragment(Fragment fragment, String name) {
fragmentList.add(fragment);
fragmentTitles.add(name);
}
}
ACTUALIZACIÓN : dado que esta respuesta se escribió originalmente, ahora puede tener fragmentos anidados, lo que significa que es posible que ViewPager
use fragmentos para páginas y esté en un fragmento en sí mismo. Este proyecto de muestra demuestra la técnica.
Ahora le devuelvo a su respuesta regularmente programada, presentada en su totalidad ...
Citando a mí mismo del libro:
La forma más sencilla de usar un ViewPager es tener los fragmentos de página dentro y fuera de la pantalla en función de los golpes del usuario. Esto solo funciona si ViewPager no está contenido en un fragmento, ya que no puede tener fragmentos anidados dentro de otros fragmentos.
Citando a Dianne Hackborn :
Los fragmentos anidados no son actualmente compatibles. Intentar colocar un fragmento dentro de la UI de otro fragmento dará como resultado un comportamiento indefinido y posiblemente roto.
Es perfectamente posible colocar un ViewPager
dentro de un Fragment
, siempre que los contenidos de ViewPager
no contengan fragmentos . Dado que las implementaciones concretas de PagerAdapter
proporcionadas por el paquete de soporte de Android utilizan fragmentos, debe desplegar su propio PagerAdapter
sin PagerAdapter
para poner el ViewPager
en un fragmento.
Me esforzaré por aclarar este punto en la próxima edición del libro (a menos que sea británico, en cuyo caso me esforzaré por aclarar este punto :-).