Android: necesito algunas aclaraciones sobre fragmentos, actividades y vistas

En Android API 11+, Google lanzó una nueva clase llamada Fragment .

En los videos, Google sugiere que siempre que sea posible ( link1 , link2 ), debemos usar fragmentos en lugar de actividades, pero no explicaron exactamente por qué.

¿Cuál es el propósito de los fragmentos y algunos usos posibles de ellos (que no sean algunos ejemplos de UI que se pueden lograr fácilmente mediante simples vistas / diseños)?

Mi pregunta es sobre fragmentos:

  1. ¿Cuáles son los propósitos de usar un fragmento?
  2. ¿Cuáles son las ventajas y desventajas de usar fragmentos en comparación con el uso de actividades / vistas / diseños?

Preguntas de bonificación:

  1. ¿Puedes dar algunos usos realmente interesantes para los fragmentos? Cosas que Google no mencionó en sus videos?
  2. ¿Cuál es la mejor manera de comunicarse entre fragmentos y las actividades que los contienen?
  3. ¿Cuáles son las cosas más importantes para recordar cuando usas fragmentos? ¿Algún consejo y advertencia de tu experiencia?

# 1 y # 2 ¿Cuáles son los propósitos de usar un fragmento y cuáles son las ventajas y desventajas de usar fragmentos en comparación con el uso de actividades / vistas / diseños?

Los fragmentos son la solución de Android para crear interfaces de usuario reutilizables. Puede lograr algunas de las mismas cosas usando actividades y diseños (por ejemplo, usando includes). Sin embargo; los fragmentos están conectados a la API de Android, desde HoneyComb y más. Déjame elaborar;

  • La ActionBar . Si desea que las tabs que se encuentran allí naveguen por su aplicación, verá rápidamente que la interfaz ActionBar.TabListener le proporciona una FragmentTransaction como argumento de entrada para el método onTabSelected . Probablemente puedas ignorar esto, y hacer algo más e inteligente, pero estarías trabajando contra la API, no con ella.

  • El FragmentManager maneja «atrás» para usted de una manera muy inteligente. Volver no significa regresar a la última actividad, como para actividades regulares. Significa volver al estado de fragmento anterior.

  • Puede usar el ViewPager genial con un FragmentPagerAdapter para crear interfaces de deslizamiento. El código FragmentPagerAdapter es mucho más limpio que un adaptador regular, y controla las instancias de los fragmentos individuales.

  • Su vida será mucho más fácil si usa Fragmentos cuando intenta crear aplicaciones para teléfonos y tabletas. Dado que los fragmentos están tan ligados con las API de Honeycomb +, querrá usarlos en los teléfonos para reutilizar el código. Ahí es donde la biblioteca de compatibilidad es útil.

  • Incluso podría y debería usar fragmentos para aplicaciones destinadas únicamente a teléfonos. Si tiene portabilidad en mente. Uso ActionBarSherlock y las bibliotecas de compatibilidad para crear aplicaciones de “búsqueda ICS”, que se ven igual desde la versión 1.6. Obtiene las últimas características como ActionBar , con tabs, desbordamiento, barra de acción dividida, viewpager, etc.

Bonificación 2

La mejor forma de comunicarse entre fragmentos son los bashs. Cuando presionas algo en un Fragmento, normalmente llamas a StartActivity() con datos en él. La intención se transmite a todos los fragmentos de la actividad que inicie.

  1. Fragmento es parte de una actividad, que aporta su propia interfaz de usuario a esa actividad. Fragmento se puede pensar como una sub actividad. Donde la pantalla completa con la que el usuario interactúa se llama actividad. Una actividad puede contener fragmentos múltiples. Los fragmentos son principalmente una parte secundaria de una actividad.

  2. Una actividad puede contener 0 o múltiples fragmentos en función del tamaño de la pantalla. Un fragmento se puede reutilizar en actividades múltiples, por lo que actúa como un componente reutilizable en actividades.

  3. Un fragmento no puede existir de forma independiente. Debe ser siempre parte de una actividad. Donde la actividad puede existir sin ningún fragmento en ella.

No estoy seguro a qué video (s) se refiere, pero dudo que digan que debe usar fragmentos en lugar de actividades, porque no son directamente intercambiables. De hecho, hay una entrada bastante detallada en la Guía de desarrollo, considere leerla para más detalles.

En resumen, los fragmentos viven dentro de las actividades y cada actividad puede albergar muchos fragmentos. Al igual que las actividades, tienen un ciclo de vida específico, a diferencia de las actividades, no son componentes de aplicaciones de alto nivel. Las ventajas de los fragmentos incluyen la reutilización y la modularidad del código (por ejemplo, usar la misma vista de lista en muchas actividades), incluida la capacidad de crear interfaces de paneles múltiples (principalmente útiles en tabletas). La principal desventaja es (alguna) complejidad añadida. En general, puede lograr lo mismo con las vistas (personalizadas) de una manera no estándar y menos sólida.

Un Fragmento es una parte de la interfaz de usuario o comportamiento de una aplicación que se puede colocar en una Actividad que permite un diseño de actividad más modular. No estaría mal si decimos que un fragmento es una especie de subactividad.

Los siguientes son puntos importantes sobre un fragmento:

  1. Un fragmento tiene su propio diseño y su propio comportamiento con sus propias devoluciones de llamadas del ciclo de vida.

  2. Puede agregar o eliminar fragmentos en una actividad mientras se ejecuta la actividad.

  3. Puede combinar múltiples fragmentos en una sola actividad para construir una interfaz de usuario de paneles múltiples.

  4. Un fragmento se puede usar en actividades múltiples.

  5. El ciclo de vida del fragmento está estrechamente relacionado con el ciclo de vida de su actividad de host.

  6. Cuando la actividad está en pausa, todos los fragmentos disponibles en la actividad también se detendrán.

  7. Un fragmento puede implementar un comportamiento que no tiene un componente de interfaz de usuario.

  8. Se agregaron fragmentos a la API de Android en Android 3 (Honeycomb) con API versión 11.

Para obtener más información, visite el sitio oficial, Fragments .

Esta es información importante que encontré en fragmentos:

Históricamente, cada pantalla de una aplicación de Android se implementó como una actividad separada. Esto crea un desafío al pasar información entre pantallas porque el mecanismo Android Intent no permite pasar un tipo de referencia (es decir, un objeto) directamente entre Actividades. En su lugar, el objeto debe ser serializado o debe haber una referencia accesible a nivel mundial disponible.

Al hacer que cada pantalla sea un Fragmento separado, este dolor de cabeza que pasa datos se evita por completo. Los fragmentos siempre existen dentro del contexto de una Actividad dada y siempre pueden acceder a esa Actividad. Al almacenar la información de interés dentro de la Actividad, el Fragmento para cada pantalla puede acceder simplemente a la referencia del objeto a través de la Actividad.

Los fragmentos son de uso particular en algunos casos, como cuando queremos mantener un cajón de navegación en todas nuestras páginas. Puede inflar un diseño de marco con el fragmento que desee y aún tener acceso al cajón de navegación.

Si hubiera utilizado una actividad, habría tenido que mantener el cajón en todas las actividades, lo que genera un código redundante. Este es un uso interesante de un fragmento.

Soy nuevo en Android y todavía creo que un fragmento es útil de esta manera.

Sé que esto ya fue discutido hasta la muerte, pero me gustaría agregar algunos puntos más:

  • Los archivos Frags se pueden usar para completar Menu y pueden manejar los clics de MenuItem por sí mismos. Proporcionando así opciones de modulación adicionales para sus actividades. Puede hacer cosas de la barra de herramientas contextual y así sucesivamente sin que su actividad lo sepa y, básicamente, puede desacoplarlo de las cosas básicas que maneja su actividad (navegación / configuraciones / Acerca de).

  • Un padre Frag con niño Frags puede darle más opciones para modular sus componentes. Por ejemplo, puede intercambiar fácilmente Frags, colocar nuevos Frags dentro de un Buscapersonas o eliminarlos, reorganizarlos. Todo sin tu actividad sabiendo nada al respecto, solo centrándote en las cosas de más alto nivel.

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.

  • 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 stack de respaldo administrada por la actividad: cada entrada de la stack de respaldo en la actividad es un registro de la transacción de fragmento que ocurrió. La stack posterior le permite al usuario revertir una transacción de fragmento (navegar hacia atrás), presionando el botón Atrás.

  • Cuando agrega un fragmento como parte de su diseño de actividad, vive en un grupo de vistas dentro de la jerarquía de vistas de la actividad y el fragmento define su propio diseño de vista. Puede insertar un fragmento en su diseño de actividad declarando el fragmento en el archivo de diseño de la actividad, como un elemento, o desde el código de su aplicación agregándolo a un ViewGroup existente. Sin embargo, no se requiere que un fragmento sea parte del diseño de la actividad; también puede usar un fragmento sin su propia IU como trabajador invisible para la actividad.

  • Por ejemplo: si utilizara NavigationDrawer sin Fragmentos, sería mejor mantener la instancia de NavigationDrawer en una sola Actividad y cuando navegue por la aplicación eligiendo entre los elementos de NavigationDrawer, entonces cada una de las Actividades que se inician no debe implementar el NavigationDrawer, pero en su lugar debe implementar el botón Atrás para volver a la Actividad “Principal” / única en la que se implementó NavigationDrawer.

    Nota: Si desea implementar NavigationDrawer en múltiples actividades, deberá recrear una nueva instancia de NavigationDrawer en cada actividad que desee mostrar.

    Supongo que esto sería una desventaja en comparación con el uso de fragmentos, mientras que si utilizó un fragmento no necesitaría muchas instancias del cajón, solo necesitaría uno.

    Cajón con fragmentos en lugar de actividades

    Si usa NavigationDrawer con Fragments, el cajón debe implementarse en una sola actividad y cuando se selecciona cada elemento del cajón, su contenido se muestra en cada uno de sus propios fragmentos.

  • Comuníquese entre fragmentos a su Actividad : Para permitir que un Fragmento se comunique con su Actividad, puede definir una interfaz en la clase Fragmento e implementarla dentro de la Actividad. El Fragmento captura la implementación de la interfaz durante su método de ciclo de vida onAttach () y puede llama a los métodos de interfaz para comunicarse con la actividad.

     public class YourFragment extends ListFragment { OnSelectedListener mCallback; // Container Activity must implement this interface public interface OnSelectedListener { public void onItemSelected(int position); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.your_view, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); // This makes sure that the container activity has implemented // the callback interface. If not, it throws an exception try { mCallback = (OnSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement OnSelectedListener"); } } }... 

Ahora el fragmento puede entregar mensajes a la actividad llamando al método onItemSelected () (u otros métodos en la interfaz) usando la instancia de mCallback de la interfaz OnSelectedListener.

 public static class MainActivity extends Activity implements YourFragment.OnSelectedListener{ ... @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); } public void onItemSelected(int position) { // The user selected the headline of an article from the YourFragment // Do something here to display that article YourFragment yourFrag = (YourFragment) getSupportFragmentManager().findFragmentById(R.id.your_fragment); if (yourFrag != null) { // If your frag is available, we're in two-pane layout... // Call a method in the YourFragment to update its content yourFrag.updateView(position); } else { // Otherwise, we're in the one-pane layout and must swap frags... // Create fragment and give it an argument for the selected item YourFragment newFragment = new YourFragment(); Bundle args = new Bundle(); args.putInt(YourFragment.ARG_POSITION, position); newFragment.setArguments(args); FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); // Replace whatever is in the fragment_container view with this fragment, // and add the transaction to the back stack so the user can navigate back transaction.replace(R.id.fragment_container, newFragment); transaction.addToBackStack(null); // Commit the transaction transaction.commit(); } } } 

Un fragmento vive dentro de una actividad.

Mientras que una actividad vive en sí misma.

Fragmentos vive dentro de la Actividad y tiene:

  • su propio ciclo de vida
  • su propio diseño
  • sus propios fragmentos secundarios, etc.

Piense en Fragmentos como una actividad secundaria de la actividad principal a la que pertenece, no puede existir por sí misma y puede ser llamada / reutilizada una y otra vez. Espero que esto ayude 🙂

1.Propuestas de usar un fragmento?

  • Ans:
    1. Tratar con las diferencias de factor de forma del dispositivo.
    2. Pasar información entre las pantallas de la aplicación.
    3. Organización de interfaz de usuario.
    4. Metáforas de UI avanzadas.

La actividad son los componentes de pantalla completa en la aplicación con la barra de herramientas, todo lo demás son preferiblemente Fragmentos. Una actividad principal de pantalla completa con una barra de herramientas puede tener varios paneles, páginas desplazables, cuadros de diálogo, etc. (todos los fragmentos) a todos los cuales se puede acceder desde el elemento primario y comunicarse a través del elemento primario.

Ejemplo –

Actividad A, Actividad B, Actividad C –

  • Todas las actividades deben tener el mismo código repetido, para mostrar una barra de herramientas básica, por ejemplo, o heredar de una actividad principal (se vuelve difícil de administrar).
  • Para pasar de una actividad a otra, o bien todas deben estar en la memoria (sobrecarga) o una necesita ser destruida para que la otra se abra.
  • La comunicación entre Actividades se puede hacer a través de Intents.

vs

Actividad A, Fragmento 1, Fragmento 2, Fragmento 3 –

  • Sin repetición de código, todas las pantallas tienen barras de herramientas, etc. de esa actividad.
  • Varias maneras de pasar de un fragmento al siguiente: ver buscapersonas, panel múltiple, etc.
  • La actividad tiene la mayoría de los datos, por lo que se necesita comunicación mínima entre fragmentos. Si aún es necesario, se puede hacer a través de interfaces fácilmente.
  • Los fragmentos no necesitan ser de pantalla completa, ni mucho menos flexibles al diseñarlos.
  • Los fragmentos no necesitan inflar el diseño si las vistas no son necesarias.
  • Varias actividades pueden usar el mismo fragmento.