Estoy escribiendo una aplicación para tabletas 4.0 y 4.1, para las cuales no quiero usar las bibliotecas de soporte (si no es necesario), sino solo la API 4.x.
Entonces mi plataforma de destino está muy bien definida como:> = 4.0 y <= 4.1
La aplicación tiene un diseño de múltiples paneles (dos fragmentos, uno pequeño a la izquierda, un fragmento de contenido a la derecha) y una barra de acción con pestañas.
Similar a ésto:
Al hacer clic en una pestaña de la barra de acción, se cambia el fragmento "externo" y el fragmento interno es un fragmento con dos fragmentos anidados (1. fragmento pequeño de la lista izquierda, 2. fragmento de contenido ancho).
Ahora me pregunto cuál es la mejor práctica para reemplazar fragmentos y especialmente fragmentos anidados. ViewPager es parte de la biblioteca de soporte, no hay una alternativa nativa 4.x para esta clase. Parecen estar "desaprobados" en mi sentido. - http://developer.android.com/reference/android/support/v4/view/ViewPager.html
Luego leí las notas de la versión para Android 4.2, ChildFragmentManager
que serían una buena opción, pero estoy apuntando a 4.0 y 4.1, por lo que tampoco se puede usar.
ChildFragmentManager
solo está disponible en 4.2
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager ()
Desafortunadamente, casi no hay buenos ejemplos que muestren las mejores prácticas para el uso de fragmentos sin la biblioteca de soporte, incluso en todas las guías para desarrolladores de Android; y especialmente nada con respecto a los fragmentos anidados.
Entonces me pregunto: ¿no es simplemente posible escribir aplicaciones 4.1 con fragmentos anidados sin usar la biblioteca de soporte y todo lo que viene con ella? (¿necesita usar FragmentActivity en lugar de Fragment, etc.?) ¿O cuál sería la mejor práctica?
El problema que tengo actualmente en el desarrollo es exactamente esta declaración:
La biblioteca de compatibilidad de Android ahora también admite fragmentos anidados, por lo que puede implementar diseños de fragmentos anidados en Android 1.6 y versiones posteriores.
Nota: No puede inflar un diseño en un fragmento cuando ese diseño incluye un
<fragment>
. Los fragmentos anidados solo se admiten cuando se agregan a un fragmento de forma dinámica.
Porque puse definir los fragmentos anidados en XML, lo que aparentemente causa un error como:
Caused by: java.lang.IllegalArgumentException: Binary XML file line #15: Duplicate id 0x7f090009, tag frgCustomerList, or parent id 0x7f090008 with another fragment for de.xyz.is.android.fragment.CustomerListFragment_
Por el momento, concluyo por mí mismo: incluso en 4.1, cuando ni siquiera quiero apuntar a la plataforma 2.x, los fragmentos anidados como se muestra en la captura de pantalla no son posibles sin la biblioteca de soporte.
(Esto en realidad podría ser más una entrada de wiki que una pregunta, pero tal vez alguien más lo haya logrado antes).
Actualizar:
Una respuesta útil está en: Fragment Inside Fragment
fuente
ActionBar
(construido internamente por Samsung). Eche un vistazo más de cerca a ActionBarSherlock, tiene las pestañas en ActionBar si hay espacio.Respuestas:
Limitaciones
Por lo tanto, no es posible anidar fragmentos dentro de otro fragmento con xml, independientemente de la versión
FragmentManager
que use.Por lo tanto, debe agregar fragmentos a través del código, esto puede parecer un problema, pero a la larga hace que sus diseños sean superflexibles.
Entonces, ¿anidar sin usar
getChildFragmentManger
? La esencia detráschildFragmentManager
es que pospone la carga hasta que finaliza la transacción del fragmento anterior. Y, por supuesto, solo se admitía naturalmente en 4.2 o en la biblioteca de soporte.Anidamiento sin ChildManager - Solución
¡Solución, claro! He estado haciendo esto durante mucho tiempo (desde que
ViewPager
se anunció).Vea abajo; Este es un
Fragment
que difiere la carga, por lo queFragment
se pueden cargar s dentro de él.Es bastante simple,
Handler
es una clase realmente muy útil, efectivamente el controlador espera un espacio para ejecutar en el hilo principal después de que la transacción del fragmento actual haya terminado de confirmarse (ya que los fragmentos interfieren con la interfaz de usuario que se ejecutan en el hilo principal).No lo consideraría una 'mejor práctica', pero tengo aplicaciones en vivo que usan este truco y aún no he tenido ningún problema con él.
También utilizo este método para incrustar buscapersonas de vista: https://gist.github.com/chrisjenx/3405429
fuente
fragment
elemento, anularía la súper implementación e intentaría analizarlo / inflarlo usted mismo. Pero eso será MUCHO esfuerzo, fuera del alcance de una pregunta de StackOverflow.La mejor manera de hacer esto en la pre-API 17 es no hacerlo en absoluto. Intentar implementar este comportamiento generará problemas. Sin embargo, eso no quiere decir que no se pueda falsificar de manera convincente utilizando la API actual 14. Lo que hice fue lo siguiente:
1 - observe la comunicación entre fragmentos http://developer.android.com/training/basics/fragments/communicating.html
2 - mueva su diseño xml FrameLayout de su Fragmento existente al diseño de Actividad y ocúltelo dando una altura de 0:
3 - Implementar la interfaz en el fragmento principal
4 - Implementar la interfaz en la actividad principal
La clase pública YourActivity amplía Activity implementa yourParentFragment.OnListener {
}
5 - Disfrute, con este método obtiene la misma funcionalidad fluida que con la función getChildFragmentManager () en un entorno anterior a la API 17. Como habrá notado, el fragmento secundario ya no es realmente un elemento secundario del fragmento principal, sino que ahora es un elemento secundario de la actividad, esto realmente no se puede evitar.
fuente
Tuve que lidiar con este problema exacto debido a una combinación de NavigationDrawer, TabHost y ViewPager que tuvo complicaciones con el uso de la biblioteca de soporte debido a TabHost. Y luego también tuve que admitir la API mínima de JellyBean 4.1, por lo que usar fragmentos anidados con getChildFragmentManager no era una opción.
Entonces mi problema se puede destilar a ...
Mi solución fue crear la ilusión de fragmentos anidados sin realmente anidar fragmentos. Hice esto haciendo que la actividad principal usara TabHost Y ViewPager para administrar dos Vistas hermanas cuya visibilidad se administra alternando layout_weight entre 0 y 1.
Esto permitió que mi "Fragmento anidado" falso funcionara como una vista independiente siempre que gestionara manualmente los pesos de diseño relevantes.
Aquí está mi activity_main.xml:
Tenga en cuenta que "@ + id / pager" y "@ + id / container" son hermanos de 'android: layout_weight = "0.5"' y 'android: layout_height = "0dp"'. Esto es para que pueda verlo en la vista previa para cualquier tamaño de pantalla. De todos modos, sus pesos se manipularán en código durante el tiempo de ejecución.
fuente
SO
que usarActionBar
pestañas con aNavigation Drawer
no es bueno porque colocará automáticamente las pestañas sobre la vista de su cajón. Lo siento, no tengo el enlace para hacer una copia de seguridad.Sobre la base de la respuesta de @ Chris.Jenkins, esta es la solución que me ha funcionado bien, para eliminar fragmentos durante los eventos del ciclo de vida (que tienen una tendencia a lanzar IllegalStateExceptions). Esto usa una combinación del enfoque Handler y una verificación Activity.isFinishing () (de lo contrario, arrojará un error para "No se puede realizar esta acción después de onSaveInstanceState).
Uso:
fuente
Aunque el OP puede tener circunstancias especiales que le impiden usar la Biblioteca de soporte, la mayoría de la gente debería usarla. La documentación de Android lo recomienda y hará que su aplicación esté disponible para la mayor audiencia posible.
En mi respuesta más completa aquí , hice un ejemplo que demuestra cómo usar fragmentos anidados con la biblioteca de soporte.
fuente