Android-Necesito algunas aclaraciones de fragmentos vs actividades y vistas


En Android API 11+, Google ha lanzado una nueva clase llamada Fragment.

En los videos, Google sugiere que siempre que sea posible (link1, link2 ), deberíamos 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 (aparte de algunos ejemplos de interfaz de usuario que se pueden lograr fácilmente mediante vistas/diseños simples)?

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 adicionales:

  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 los fragmentos y las actividades que los contienen?
  3. ¿Cuáles son las cosas más importantes a recordar cuando se utilizan fragmentos? Cualquier consejos y advertencias de su experiencia?
Author: Peter Mortensen, 2012-05-07

12 answers

#1 & #2 cuáles son los propósitos de usar un fragmento y cuáles son los ventajas y desventajas de usar fragmentos en comparación con usar actividades/views/layouts?

Los fragmentos son la solución de Android para crear interfaces de usuario reutilizables. Puedes 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 hacia arriba. Permítanme elaborar;

  • Las ActionBar. Si desea pestañas allí para navegar por su aplicación, verá rápidamente que la interfaz ActionBar.TabListener le da un FragmentTransaction como argumento de entrada para el método onTabSelected. Probablemente podría ignorar esto y hacer algo más inteligente, pero estaría trabajando en contra de la API, no con ella.

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

  • Tú puede usar el cool ViewPager con un FragmentPagerAdapter para crear interfaces swipe. 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 utiliza Fragmentos cuando intenta crear aplicaciones para teléfonos y tabletas. Dado que los fragmentos están tan vinculados con las API Honeycomb+, querrá usarlos en teléfonos también 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 solo para teléfonos. Si tienes la portabilidad en mente. Utilizo ActionBarSherlock y las bibliotecas de compatibilidad para crear aplicaciones "ICS looking", que se ven igual hasta la versión 1.6. Obtienes las últimas características como ActionBar, con pestañas, desbordamiento, barra de acción dividida, viewpager, etc.

Bono 2

La mejor manera de comunicarse entre fragmentos son las intenciones. Cuando presionas algo en un fragmento que normalmente llamarías StartActivity() con datos en él. La intent se transmite a todos los fragmentos de la actividad que inicias.

 242
Author: Glenn Bech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-31 11:58:55
  1. Fragment es una parte de una actividad, que contribuye con su propia IU a esa actividad. Fragmento puede ser pensado como una actividad secundaria. Donde en calidad de actividad se llama la pantalla completa, con que el usuario interactúa. Una actividad puede contener varios fragmentos.Los fragmentos son en su mayoría una parte secundaria de una actividad.

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

  3. Un fragmento no puede existir independientemente. Siempre debe ser parte de una actividad. Donde la actividad as puede existir sin ningún fragmento en ella.

 88
Author: Jagan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-08 07:29:52

No estoy seguro de a qué video(s) te refieres, pero dudo que estén diciendo que deberías usar fragmentos en lugar de actividades, porque no son directamente intercambiables. En realidad hay una entrada bastante detallada en la Guía de Desarrollo, considere leerla para obtener 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 nivel superior. Las ventajas de los fragmentos incluyen la reutilización de código y la modularidad (por ejemplo, el uso de la misma vista de lista en muchas actividades), incluida la capacidad de construir interfaces multi-panel (en su mayoría útiles en tabletas). La principal desventaja es (alguna) complejidad añadida. Generalmente puede lograr lo mismo con vistas (personalizadas) de una manera no estándar y menos robusta.

 63
Author: Nikolay Elenkov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-24 14:25:48

Un fragmento es una pieza de la interfaz de usuario o el comportamiento de una aplicación que se puede colocar en una Actividad que habilita un diseño de actividad más modular. No estará 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 llamada de ciclo de vida.

  2. Puede agregar o eliminar fragmentos en una actividad mientras la actividad está ejecutar.

  3. Puede combinar varios fragmentos en una sola actividad para crear una interfaz de usuario de varios paneles.

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

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

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

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

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

Para más detalles, visite el sitio oficial, Fragmentos.

 43
Author: mani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-31 17:05:41

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

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

Haciendo de cada pantalla un fragmento separado, este dato dolor de cabeza pasajero se evita por completo. Los fragmentos siempre existen en el contexto de un actividad dada y siempre puede acceder a esa Actividad. Almacenando el información de interés dentro de la Actividad, el Fragmento para cada screen puede simplemente acceder a la referencia del objeto a través de la Actividad.

 13
Author: Kaveesh Kanwal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-31 17:09:48

Los fragmentos son de particular utilidad 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 cualquier fragmento que desee y aún así 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 hace que el código sea 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.

 7
Author: Nithin Baby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-31 17:09:16

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

  • Los fragmentos se pueden usar para rellenar Menu s y pueden manejar MenuItem clics por su cuenta. Dando así más opciones de modulación para sus actividades. Puede hacer cosas ContextualActionBar 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 / Configuración / Acerca de).

  • Un fragmento de padre con fragmentos de hijo puede dar más opciones para modular sus componentes. Por ejemplo, puede intercambiar fácilmente fragmentos, poner nuevos fragmentos dentro de un buscapersonas o eliminarlos, reorganizarlos. Todo sin que tu Actividad sepa nada al respecto, solo enfocándote en las cosas de nivel superior.

 4
Author: einschnaehkeee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-17 08:16:05

Un fragmento representa un comportamiento o una parte de la interfaz de usuario en una Actividad. Puede combinar varios fragmentos en una sola actividad para crear una interfaz de usuario de varios paneles y reutilizar un fragmento en varias 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 pila posterior administrada por la actividad: cada entrada de pila posterior en la actividad es un registro de la transacción de fragmento que se produjo. El back stack permite al usuario revertir una transacción de fragmentos (navegar hacia atrás), presionando el botón Back.

  • Cuando añades un fragmento como parte de tu diseño de actividad, se encuentra en un ViewGroup dentro de la jerarquía de vistas de la actividad y el fragmento define su propio ver diseño. Puedes insertar un fragmento en el diseño de tu actividad declarándolo en el archivo de diseño de la actividad, como elemento o desde el código de tu aplicación agregándolo a un ViewGroup existente. Sin embargo, no es necesario que un fragmento forme parte del diseño de la actividad; también puede usar un fragmento sin su propia interfaz de usuario como un trabajador invisible para la actividad.

  • Por ejemplo: Si tuviera que utilizar NavigationDrawer sin fragmentos, entonces sería mejor mantener la instancia NavigationDrawer en una sola actividad y cuando navegue por la aplicación eligiendo entre los elementos del NavigationDrawer, cada una de las Actividades que se inician no debe implementar el NavigationDrawer, sino que debe implementar el botón atrás para Navegar de nuevo a la actividad "Principal"/única en la que se implementó el NavigationDrawer.

    Nota: Si desea implementar el NavigationDrawer en múltiples actividades, tendría que recrear una nueva instancia de la NavigationDrawer en cada actividad que desee mostrar.

    Supongo que esto sería una desventaja frente al uso de Fragmentos, mientras que si utilizaras un fragmento no necesitarías muchas instancias del cajón solo necesitarías una.

    Cajón Con Fragmentos en lugar de Actividades

    Si utiliza el NavigationDrawer con Fragmentos, entonces el cajón debe implementarse en una sola actividad y cuando se selecciona cada elemento del cajón, sus contenidos se muestran en cada uno de sus fragmentos muy propios.

  • Comunicar entre fragmento a su Actividad: Para permitir que un Fragmento se comunique con su Actividad, puede definir una interfaz en la clase Fragment 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 luego puede llamar a los métodos de la 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 enviar mensajes a la actividad llamando al método onItemSelected () (u otros métodos en la interfaz) usando la instancia mCallback de la interfaz onelectedlistener.

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();
        }
    }
}
 1
Author: Zealous,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-19 07:33:16

Un fragmento vive dentro de una actividad.

Mientras una actividad vive sobre sí misma.

 0
Author: superkytoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-14 11:15:58

Los fragmentos viven dentro de la Actividad y tienen:

  • su propio ciclo de vida
  • su propio diseño
  • sus propios fragmentos hijo y etc.

Piense en los 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:)

 0
Author: maniix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-15 12:46:47

1.¿Propósitos de usar un fragmento?

  • Ans:
    1. Tratar con las diferencias de factor de forma del dispositivo.
    2. Pasar información entre pantallas de aplicaciones.
    3. Organización de la interfaz de usuario.
    4. Metáforas avanzadas de IU.
 0
Author: Prithiv Dharmaraj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-28 09:19:50

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, diálogos, etc. (todos los fragmentos) a todos los cuales se puede acceder desde el padre y comunicarse a través del padre.

Ejemplo -

Actividad A, Actividad B, Actividad C -

  • Todas las actividades deben tener el mismo código repetido, para mostrar un barra de herramientas por ejemplo o heredar de una actividad de los padres (se convierte en engorroso de manejar).
  • Para pasar de una actividad a la otra, o bien todas necesitan estar en 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 -

  • No hay repetición de código, todas las pantallas tienen barras de herramientas, etc. de esa actividad.
  • Varias maneras de pasar de un fragmento al paginador de la vista siguiente, panel múltiple, etc.
  • La actividad tiene la mayoría de los datos, por lo que se necesita una comunicación mínima entre fragmentos. Si todavía es necesario, se puede hacer a través de interfaces fácilmente.
  • Los fragmentos no necesitan ser a pantalla completa, carga de flexibilidad en el diseño de ellos.
  • Los fragmentos no necesitan inflar el diseño si las vistas no son necesarias.
  • Varias actividades pueden usar el mismo fragmento.
 0
Author: Chandrima Bhattacharjee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-28 23:14:09