Introducción:
El patrón básico del "Tutorial de fragmentos" es más o menos así:
- En una tableta, tenga una lista a la izquierda, detalles a la derecha.
- Ambos son
Fragments
y ambos residen en el mismoActivity
. - En un teléfono, tenga una lista
Fragment
en unoActivity
. - Lanzar una nueva
Activity
con los detallesFragment
.
(p. ej., Android 3.0 Fragments API de Dianne Hackborn y Fragments API Guide )
En ambos dispositivos, la funcionalidad está en el Fragments
. (sencillo)
En la tableta , toda la aplicación es 1Activity
, en el teléfono , hay muchasActivities
.
Preguntas:
- ¿Hay alguna razón para dividir la aplicación del teléfono en muchas
Activities
?
Un problema con este método es que duplica una gran parte de la lógica en la tableta principal Activity
y en el teléfono por separado Activities
.
- ¿No sería más fácil retener el modelo de 1 Actividad en ambos casos, usando la misma lógica de encendido
Fragments
y apagado (solo usando un diseño diferente)?
De esta manera, la mayor parte de la lógica reside en Fragments
sí mismos, y solo hay una única Activity
duplicación de código.
También lo que he leído acerca de esto ActionBarSherlock
es que parece funcionar mejor en Fragments
lugar de Activities
(pero aún no he trabajado con él).
¿Los tutoriales están demasiado simplificados o me he perdido algo importante en este enfoque?
Hemos probado ambos enfoques con éxito en la oficina, pero estoy a punto de comenzar un proyecto más grande y quiero hacer las cosas lo más fáciles para mí.
Algunos enlaces a preguntas relacionadas:
- Dilema: cuándo usar Fragmentos vs Actividades:
- Patrones de cuándo utilizar la transición de actividad frente a fragmentos dinámicos
- Android: necesito algunas aclaraciones de fragmentos frente a actividades y vistas
- ¿Actividades o fragmentos en Android?
- Diseño de interacción de múltiples fragmentos y actividades.
- ¿Cuáles son las ventajas exactas de Fragments en Android 3.0?
Actualizaciones
Comencé la recompensa por una pregunta: todavía no estoy convencido de por qué necesito duplicar la lógica de mi aplicación en la actividad de mi tableta y en cada actividad del teléfono.
También encontré un artículo interesante de los chicos de Square, que bien vale la pena leer:
fuente
onItemSelected()
método en la Actividad. En mi aplicación "real", tengo muchas listas y sublistas. Este patrón sugiere que mi actividad de pestaña debe tener unonItemSelected()
método para manejar cada una de las listas. Además, las actividades del teléfono deben tener la misma lógica duplicada dentro de cada una de ellas. En mi humilde opinión, es mucho mejor poner la lógica Elemento seleccionado en cada fragmento: no hay duplicación y prefiero esa forma de estructurar el código. Espero que esto ayudeRespuestas:
Estoy de acuerdo en que los tutoriales están muy simplificados. Simplemente presentan,
Fragments
pero no estoy de acuerdo con el patrón sugerido.También estoy de acuerdo en que no es una buena idea duplicar la lógica de su aplicación en muchas Actividades (consulte el Principio DRY en wikipedia ).
Prefiero el patrón utilizado por la
ActionBarSherlock
aplicación Fragments Demo ( descargar aquí y código fuente aquí ). La demostración que más se acerca al tutorial mencionado en la pregunta es la llamada "Diseño" en la aplicación; oFragmentLayoutSupport
en el código fuente.En esta demostración, la lógica se ha movido del
Activity
y alFragment
. ElTitlesFragment
realmente contiene la lógica para cambiar Fragmentos. De esta manera, cada actividad es muy simple. Duplicar muchas actividades muy simples, donde ninguna de las lógicas está dentro de las actividades, lo hace muy simple.Al poner la lógica en los Fragmentos, no hay necesidad de escribir el código más de una vez ; está disponible sin importar en qué Actividad se coloque el Fragmento. Esto lo convierte en un patrón más poderoso que el sugerido en el tutorial básico.
Otra ventaja del patrón ABS es que no terminas con una actividad de tableta que contiene mucha lógica, y eso significa que ahorras memoria. El patrón tutorial puede conducir a una actividad principal muy grande en una aplicación más compleja; ya que necesita manejar la lógica de todos los fragmentos que se colocan en él en cualquier momento.
En general, no piense que es forzado a usar muchas actividades. Piense que tiene la oportunidad de dividir su código en muchos fragmentos y ahorrar memoria al usarlos.
fuente
Creo que estás en el camino correcto. (Y sí, los tutoriales están demasiado simplificados).
En un diseño de tableta, puede usar una sola Actividad e intercambiar Fragmentos (en múltiples 'paneles'). Mientras está en un diseño de teléfono, puede usar una nueva Actividad para cada Fragmento.
Al igual que:
Puede parecer mucho trabajo extra, pero al usar múltiples actividades para teléfonos, habilita el ciclo de vida básico de la actividad y el paso de intenciones. Esto también permite que el marco maneje todas las animaciones y el back-stack.
Para ayudar a reducir el código, puede usar
BaseActivity
ay extender desde eso.Entonces, si el usuario tiene una tableta que usaría
MyMultiPaneFragActivity
o algo similar. Esta actividad es responsable de administrar las devoluciones de llamada de los fragmentos y las intenciones de enrutamiento al fragmento correcto (como una intención de búsqueda)Si el usuario tiene un teléfono, puede usar una Actividad regular con muy poco código y hacer que se extienda
MyBaseSingleFragActivity
o algo similar. Estas actividades pueden ser muy simples, 5-10 líneas de código (quizás incluso menos).La parte difícil es enrutar los intentos y demás. * (Editar: ver más abajo).
Creo que la razón por la que esta es la forma recomendada es ahorrar memoria y reducir la complejidad y el acoplamiento. Si está intercambiando Fragmentos, el
FragmentManager
mantiene una referencia a ese Fragmento para la pila de reserva. También simplifica lo que debería estar 'ejecutándose' para el usuario. Esta configuración también desacopla las vistas, el diseño y la lógica en el Fragmento del ciclo de vida de la Actividad. De esta manera, un Fragmento puede existir en una sola actividad, junto con otro fragmento (dos paneles), o en una Actividad de tres paneles, etc.* Uno de los beneficios de tener un enrutamiento de intención regular es que puede iniciar una Actividad explícitamente desde cualquier lugar de la pila de reserva. Un ejemplo podría ser en el caso de los resultados de búsqueda. (MySearchResults.class).
Lee aquí para más:
http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html
fuente
Aquí está la respuesta de Reto Meier sobre lo mismo, tomada de este video del curso de Fundamentos de Android de Udacity .
fuente
En el patrón maestro-detalle, hay dos actividades. Uno muestra ambos fragmentos en pantallas más grandes y solo el fragmento "maestro" en pantallas más pequeñas. El otro muestra el fragmento de "detalle" en pantallas más pequeñas.
Su lógica de detalle debe estar ligada al fragmento de detalle. Por lo tanto, no hay duplicación de código relacionada con la lógica de detalle entre actividades: la actividad de detalle simplemente muestra el fragmento de detalle, quizás pasando datos de un
Intent
extra.ActionBarSherlock no tiene más que ver con fragmentos que la barra de acción nativa, ya que ActionBarSherlock es puramente un backport de la barra de acción nativa.
fuente
Refiriéndose a la primera pregunta de "¿Hay alguna razón para dividir la aplicación del teléfono en muchas Actividades?" - Si. simplemente se reduce al espacio disponible, una tableta da más espacio a los desarrolladores, lo que permite a los desarrolladores poner más en una pantalla. Android nos dice que Actividades puede proporcionar una pantalla . Entonces, lo que puede hacer con 1 pantalla grande en una tableta es algo que puede tener que extenderse a través de múltiples pantallas en un teléfono, porque no hay suficiente espacio para todos los fragmentos.
fuente