Actionbarsherlock + tabs + múltiples fragmentos?

He intentado tanto para que actionbarsherlock + tabs + fragments funcionen.

Solo puedo hacer que este conjunto funcione como estático, me gustaría crear esta aplicación de Android para el mercado (movimiento de deslizamiento).

Me quedo atascado cuando necesitas inflar un diseño con múltiples fragmentos dentro.

En Support4demos, obtuve FragmentsTabsPager como ejemplo a seguir.

    Necesita las bibliotecas adecuadas para implementar lo que desea.

    Básicamente, una biblioteca ViewPager es lo que falta de ti. Mis sugerencias:

    1. ActionbarSherlock

    Es tan fácil trabajar con eso que no voy a explicarlo.

    2. ViewPagerExtensions

    Puedes encontrarlo aquí . Descargue los archivos ZIP y cree un nuevo proyecto a partir de él.

    Solo puedo hacer que este conjunto funcione como estático, me gustaría crear esta aplicación de Android para el mercado (movimiento swype).

    Implemente com.astuetz.viewpager.extensions.SwipeyTabsView desde este proyecto. Hay ejemplos fáciles de seguir. hace exactamente lo que quieres. Incluso hay otros estilos de pestaña para elegir (incluida la nueva pestaña Personas que viene con ICS). Además, es muy fácil diseñarlo para que coincida con la identidad de tu aplicación.

    3. FragmentPagerAdapter

    Finalmente, esa clase de la biblioteca de soporte (v4).

    Buena suerte, y tenga la libertad de preguntarme si necesita más ayuda.


    No necesita anular instantiateItem en FragmentPagerAdapter si está utilizando lo que sugerí. Solo necesitas

    1. Proporcione un constructor con un FragmentManager y llame a la súper implementación;
    2. getCount para devolver el número de fragmentos en su buscapersonas, y
    3. getItem , que es lo que getItem para devolver tus fragmentos para la creación.

    Este es un ejemplo del código que tengo aquí (un trabajo completo, ejemplo de producción). Es una clase interna para la actividad que implementa el buscapersonas:

     static class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public int getCount() { return 2; } @Override public Fragment getItem(int position) { Fragment f; switch(position) { case 0: f= new ItemSalesDataFragment(); break; case 1: f= new DepartmentChooserFragment(); break; default: throw new IllegalArgumentException("not this many fragments: " + position); } return f; } } 

    Como puede ver, este buscapersonas maneja dos ‘páginas’, el izquierdo muestra datos de ventas. El correcto le permite al usuario seleccionar qué departamento. Esos son devueltos en el método getItem . Los fragmentos adecuados (puedes usar cualquier Fragmento que ya tengas, sin modificaciones).

    Como era de esperar, unir todo esto al crear 1) crear un objeto que crea una instancia de MyFragmentPagerAdapter , y 2) configurar el adaptador a su objeto ViewPager para que sea la clase que acaba de instanciar. Como puede ver, su método getItem le dará al buscapersonas todos los fragmentos que necesita. Ejemplo:

     mFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); mViewPager.setAdapter(mFragmentPagerAdapter); 

    Por supuesto, hay otras cosas que hacer, como crear los botones de las tabs y unir todo esto para comunicarse de forma cruzada. Sugiero que consulte los ejemplos proporcionados en el archivo ZIP ViewPagerExtensions que descarga de GitHub. Esta es solo la respuesta a la pregunta en tu comentario. Como puede ver, no es tanto código usando esta biblioteca.

    De hecho, logré que funcionara sin más que la biblioteca ABS y la biblioteca de soporte. Aquí está mi código:

     public class ActionBarTabs extends SherlockFragmentActivity { CustomViewPager mViewPager; TabsAdapter mTabsAdapter; TextView tabCenter; TextView tabText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); mViewPager = new CustomViewPager(this); mViewPager.setId(R.id.pager); setContentView(mViewPager); ActionBar bar = getSupportActionBar(); bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); bar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); mTabsAdapter = new TabsAdapter(this, mViewPager); mTabsAdapter.addTab(bar.newTab().setText("Home"), ToolKitFragment.class, null); mTabsAdapter.addTab(bar.newTab().setText("FujiSan"), FujiFragment.class, null); } public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener { private final Context mContext; private final ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList mTabs = new ArrayList(); static final class TabInfo { private final Class< ?> clss; private final Bundle args; TabInfo(Class< ?> _class, Bundle _args) { clss = _class; args = _args; } } public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = activity.getSupportActionBar(); mViewPager = pager; mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); } public void addTab(ActionBar.Tab tab, Class< ?> clss, Bundle args) { TabInfo info = new TabInfo(clss, args); tab.setTag(info); tab.setTabListener(this); mTabs.add(info); mActionBar.addTab(tab); notifyDataSetChanged(); } @Override public int getCount() { return mTabs.size(); } @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mActionBar.setSelectedNavigationItem(position); } @Override public void onPageScrollStateChanged(int state) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { Object tag = tab.getTag(); for (int i = 0; i < mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } } } 

    Cargas el contenido de tu pestaña en función de lo siguiente.

     mTabsAdapter.addTab(bar.newTab().setText("Home"), YOURFRAGMENTHERE.class, null); 

    Esto le dará el encantador efecto "swipey tab", como se lo refiere, con ABS, la biblioteca de soporte y fragmentos. ABS realmente hace que sea casi lo mismo que trabajar con las bibliotecas nativas. De hecho, copié este código directamente del ejemplo de tabs de paginación de Google y lo modifiqué ligeramente para ABS.

    ¡Espero que esto ayude!

    Muchos ejemplos suelen arrojar una excepción ( IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first ) al volver a la pestaña seleccionada anteriormente.

    Me gusta adaptar el ejemplo de Google con un FragmentStatePageAdapter lugar de un FragmentPageAdapter simple, que reemplazará los fragmentos por usted y resolverá este error. Normalmente, esto destruirá los fragmentos que considere que se pueden eliminar para ahorrar espacio; anula destroyItem(ViewGroup, int, Object) con un bloque vacío si deseas mantener siempre tus fragmentos.

    Aquí hay un ejemplo:

     public class ActionBarTabs extends SherlockFragmentActivity { CustomViewPager mViewPager; TabsAdapter mTabsAdapter; TextView tabCenter; TextView tabText; ActionBar mActionBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); mViewPager = new CustomViewPager(this); mViewPager.setId(R.id.pager); setContentView(mViewPager); mActionBar = getSupportActionBar(); mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); mActionBar.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE); mTabsAdapter = new TabsAdapter(this, mViewPager); mTabsAdapter.addTab(mActionBar.newTab().setText("Page 1"), YOURFRAGMENT_A.class, null); mTabsAdapter.addTab(mActionBar.newTab().setText("Page 2"), YOURFRAGMENT_B.class, null); mTabsAdapter.addTab(mActionBar.newTab().setText("Page 3"), YOURFRAGMENT_C.class, null); } public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener { private final Context mContext; private final ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList mTabs = new ArrayList(); static final class TabInfo { private final Class< ?> clss; private final Bundle args; TabInfo(Class< ?> _class, Bundle _args) { clss = _class; args = _args; } } public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = activity.getSupportActionBar(); mViewPager = pager; mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); } public void addTab(ActionBar.Tab tab, Class< ?> clss, Bundle args) { TabInfo info = new TabInfo(clss, args); tab.setTag(info); tab.setTabListener(this); mTabs.add(info); mActionBar.addTab(tab); notifyDataSetChanged(); } @Override public int getCount() { return mTabs.size(); } @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { mActionBar.setSelectedNavigationItem(position); } @Override public void onPageScrollStateChanged(int state) { } @Override public void onTabSelected(Tab tab, FragmentTransaction ft) { Object tag = tab.getTag(); for (int i = 0; i < mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } } @Override public void onTabUnselected(Tab tab, FragmentTransaction ft) { } @Override public void onTabReselected(Tab tab, FragmentTransaction ft) { } } } 

    Funciona bien con ABS y es relativamente simple de implementar.