with viewpager usar studio practice example como best activity android android-fragments android-viewpager commonsware

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