2012-01-25 17 views
9

Tengo una actividad con un ViewFlipper que cambia entre un montón de vistas (páginas) con mis datos.ViewFlipper vs Fragments

Estoy considerando el uso de la API de fragmentos para alternar entre mis vistas. ¿Cuáles son los beneficios de hacerlo?

¿Pude ver un aumento en el rendimiento mediante el uso de fragmentos ya que ViewFlipper esencialmente alterna los indicadores de visibilidad y los fragmentos realmente reemplazan la jerarquía de la vista a medida que los agrega/quita?

¿Puede alguien darnos más información sobre esto?

Gracias!

+2

Si desea un análisis de rendimiento, hágalo usted mismo. En general, Stack no es bueno para responder este tipo de preguntas. – Warpzit

Respuesta

14

Un fragmento representa un comportamiento o una parte de la interfaz de usuario en una actividad. Puede combinar múltiples fragmentos en una sola actividad para construir una interfaz de usuario de paneles múltiples y reutilizar un fragmento en múltiples actividades. Puede pensar en un fragmento como una sección modular de una actividad, que tiene su propio ciclo de vida, recibe sus propios eventos de entrada y que puede agregar o eliminar mientras se ejecuta la actividad (algo así como una "subactividad" que puede reutilizar en diferentes actividades).

Un fragmento siempre debe estar incrustado en una actividad y el ciclo de vida del fragmento se ve directamente afectado por el ciclo de vida de la actividad del host. Por ejemplo, cuando la actividad está en pausa, también lo son todos los fragmentos, y cuando se destruye la actividad, también lo son todos los fragmentos. Sin embargo, mientras se está ejecutando una actividad (está en el estado reanudado del ciclo de vida), puede manipular cada fragmento de forma independiente, como agregarlos o eliminarlos. Cuando realiza una transacción de fragmento de este tipo, también puede agregarla a una pila de respaldo administrada por la actividad: cada entrada de la pila de respaldo en la actividad es un registro de la transacción de fragmento que ocurrió. La pila posterior le permite al usuario revertir una transacción de fragmento (navegar hacia atrás), presionando el botón ATRÁS.

Pero ViewFlipper funciona en una sola actividad. Simple ViewAnimator que animará entre dos o más vistas que se le han agregado. Solo se muestra un niño a la vez.Si se solicita, puede voltear automáticamente entre cada niño en un intervalo regular.

3

EDITAR: Estoy hablando de ViewPager aquí, no de ViewFlipper.

El beneficio de usar un ViewPager es que es muy simple de usar. Simplemente crea un FragmentPagerAdapter y completa un par de campos simples. A continuación se muestra un ejemplo que escribí para mostrar los elementos que se pasan de la clase principal.

public static class DashboardPagerAdapter extends FragmentPagerAdapter { 

    private static final int NUM_ITEMS_PER_SCREEN = 12; 

    private List<View> mAllItems; 
    private int mNumScreens; 

    public DashboardPagerAdapter(FragmentManager fm, List<View> allItems) { 
     super(fm); 
     mAllItems = allItems; 
     mNumScreens = (int) Math.ceil(mAllItems.size() 
       /(float) NUM_ITEMS_PER_SCREEN); 
     Log.d(TAG, "num screens: " + mNumScreens); 
    } 

    @Override 
    public int getCount() { 
     return mNumScreens; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     DashboardScreenFragment screen = DashboardScreenFragment 
       .newInstance(); 

     for (int i = position * NUM_ITEMS_PER_SCREEN; i < (position + 1) 
       * NUM_ITEMS_PER_SCREEN; i++) { 
      if (i >= mAllItems.size()) { 
       break; 
      } 
      screen.addChild(mAllItems.get(i)); 
     } 
     return screen; 
    } 
} 

Y su puesta en marcha es muy sencilla:

final DashboardPagerAdapter adapter = new DashboardPagerAdapter(
      getFragmentManager(), mAllButtons); 

Contrariamente a lo que @ sebap123 Dicho esto, puede utilizar fragmentos con v4 Android y encima con la biblioteca de soporte; vea http://developer.android.com/sdk/compatibility-library.html para más detalles, pero realmente solo implica poner el archivo jar en su directorio/libs.

Por cierto, tenga en cuenta que con ViewPager, cada "página" es en sí misma un Fragmento.

En cuanto a si hay una mejora en el rendimiento, eso depende de qué lo compares. Recomiendo probar ViewPager y solo después de preocuparme por los problemas de rendimiento. Como dijo Donald Knuth, "deberíamos olvidarnos de las pequeñas eficiencias, digamos el 97% del tiempo: la optimización prematura es la raíz de todo mal".

En cualquier caso, si tiene una gran cantidad de páginas, consulte http://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html para obtener un adaptador más apropiado.

+1

Estoy hablando de usar un ViewFlipper para voltear entre fragmentos. Me refiero a la comparación entre el uso de FragmentManager para agregar/eliminar fragmentos y el uso de un ViewFlipper que solo muestra las Vistas (¡no fragmentos de nuevo!) – dnkoutso

+0

La diferencia está en las imágenes. Si desea que el usuario pueda deslizar horizontalmente entre pantallas, debe usar ViewFlipper. Si simplemente desea agregar y eliminar fragmentos (por ejemplo, con botones), debe usar un FragmentManager. –

+1

Guau, ¿sabes lo que acabo de darme cuenta? Estuve hablando de ViewPager todo este tiempo, no de ViewFlipper. ViewFlipper es completamente diferente, lo siento. En lugar de eliminar todo, voy a editar y reemplazar "ViewFlipper" con ViewPager, aunque no responda directamente la pregunta. –

Cuestiones relacionadas