J'écris une application pour les tablettes 4.0 et 4.1, pour lesquelles je ne souhaite pas utiliser les bibliothèques de support (si ce n'est pas nécessaire) mais l'api 4.x uniquement par conséquent.
Ma plateforme cible est donc très bien définie comme:> = 4.0 et <= 4.1
L'application a une disposition à plusieurs volets (deux fragments, un petit à gauche, un fragment de contenu à droite) et une barre d'action avec des onglets.
Similaire à ceci:
Cliquer sur un onglet de la barre d'action change le fragment «externe», et le fragment interne est alors un fragment avec deux fragments imbriqués (1. petit fragment de liste à gauche, 2. fragment de contenu large).
Je me demande maintenant quelle est la meilleure pratique pour remplacer les fragments et en particulier les fragments imbriqués. Le ViewPager fait partie de la bibliothèque de support, il n'y a pas d'alternative native 4.x pour cette classe. Semblent être «obsolète» dans mon sens. - http://developer.android.com/reference/android/support/v4/view/ViewPager.html
Ensuite, j'ai lu les notes de publication pour Android 4.2, ce ChildFragmentManager
qui conviendrait bien, mais je cible les versions 4.0 et 4.1, donc cela ne peut pas être utilisé non plus.
ChildFragmentManager
n'est disponible qu'en 4.2
- http://developer.android.com/about/versions/android-4.2.html#NestedFragments
- http://developer.android.com/reference/android/app/Fragment.html#getChildFragmentManager ()
Malheureusement, il n'y a guère de bons exemples qui montrent les meilleures pratiques pour l'utilisation de fragments sans la bibliothèque de support, même dans l'ensemble des guides du développeur Android; et surtout rien concernant les fragments imbriqués.
Je me demande donc: n'est-il tout simplement pas possible d'écrire des applications 4.1 avec des fragments imbriqués sans utiliser la bibliothèque de support et tout ce qui va avec? (besoin d'utiliser FragmentActivity au lieu de Fragment, etc.?) Ou quelle serait la meilleure pratique?
Le problème que je rencontre actuellement dans le développement est exactement cette déclaration:
La bibliothèque de support Android prend désormais également en charge les fragments imbriqués, vous pouvez donc implémenter des conceptions de fragments imbriqués sur Android 1.6 et versions ultérieures.
Remarque: vous ne pouvez pas gonfler une mise en page en un fragment lorsque cette mise en page comprend un fichier
<fragment>
. Les fragments imbriqués ne sont pris en charge que lorsqu'ils sont ajoutés dynamiquement à un fragment.
Parce que j'ai mis définir les fragments imbriqués dans XML, ce qui provoque apparemment une erreur comme:
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_
Pour le moment, je conclus pour moi-même: même sur 4.1, quand je ne veux même pas cibler la plate-forme 2.x, les fragments imbriqués comme indiqué dans la capture d'écran ne sont pas possibles sans la bibliothèque de support.
(Cela pourrait en fait être plus une entrée de wiki qu'une question, mais peut-être que quelqu'un d'autre l'a déjà géré).
Mettre à jour:
Une réponse utile est à: Fragment Inside Fragment
la source
ActionBar
(construit en interne par Samsung). Regardez de plus près ActionBarSherlock, il a les onglets dans l'ActionBar s'il y a de la place.Réponses:
Limites
Ainsi, l'imbrication de fragments dans un autre fragment n'est pas possible avec xml quelle que soit la version que
FragmentManager
vous utilisez.Vous devez donc ajouter des fragments via du code, cela peut sembler un problème, mais à long terme, vos mises en page sont superflexibles.
Donc imbriquer sans utiliser
getChildFragmentManger
? L'essence derrièrechildFragmentManager
est qu'il reporte le chargement jusqu'à ce que la transaction de fragment précédente soit terminée. Et bien sûr, il n'était naturellement pris en charge que dans la version 4.2 ou dans la bibliothèque de support.Nesting sans ChildManager - Solution
Solution, bien sûr! Je fais cela depuis longtemps maintenant, (depuis que le a
ViewPager
été annoncé).Voir ci-dessous; C'est un
Fragment
qui diffère le chargement, donc lesFragment
s peuvent être chargés à l'intérieur.C'est assez simple,
Handler
c'est une classe vraiment très pratique, en fait, le gestionnaire attend qu'un espace s'exécute sur le thread principal une fois la transaction de fragment actuelle terminée (car les fragments interfèrent avec l'interface utilisateur qu'ils exécutent sur le thread principal).Je ne considérerais pas cela comme une `` meilleure pratique '', mais j'ai des applications en direct utilisant ce hack et je n'ai pas encore de problèmes avec cela.
J'utilise également cette méthode pour intégrer des pagers de vue - https://gist.github.com/chrisjenx/3405429
la source
fragment
élément, vous surchargez la super implémentation et essayez de l'analyser / gonfler vous-même. Mais ce sera BEAUCOUP d'efforts, bien hors de portée d'une question StackOverflow.La meilleure façon de le faire dans la pré-API 17 est de ne pas le faire du tout. Essayer d'implémenter ce comportement va causer des problèmes. Cependant, cela ne veut pas dire qu'il ne peut pas être simulé de manière convaincante en utilisant l'API 14 actuelle. Ce que j'ai fait, c'est ce qui suit:
1 - regardez la communication entre les fragments http://developer.android.com/training/basics/fragments/communicating.html
2 - déplacez votre mise en page xml FrameLayout de votre fragment existant vers la mise en page Activité et masquez-la en donnant une hauteur de 0:
3 - Implémenter l'interface dans le fragment parent
4 - Implémenter l'interface dans l'activité parent
classe publique YourActivity extend Activity implémente yourParentFragment.OnListener {
}
5 - Profitez bien, avec cette méthode, vous obtenez la même fonctionnalité fluide qu'avec la fonction getChildFragmentManager () dans un environnement pré-API 17. Comme vous l'avez peut-être remarqué, le fragment enfant n'est plus vraiment un enfant du fragment parent mais maintenant un enfant de l'activité, cela ne peut vraiment pas être évité.
la source
J'ai dû faire face à ce problème exact en raison d'une combinaison de NavigationDrawer, TabHost et ViewPager qui présentait des complications avec l'utilisation de la bibliothèque de support à cause de TabHost. Et puis j'ai également dû prendre en charge l'API min de JellyBean 4.1, donc utiliser des fragments imbriqués avec getChildFragmentManager n'était pas une option.
Donc, mon problème peut être distillé en ...
Ma solution était de créer l'illusion de fragments imbriqués sans réellement imbriquer les fragments. J'ai fait cela en faisant en sorte que l'activité principale utilise TabHost ET ViewPager pour gérer deux vues frères dont la visibilité est gérée en basculant layout_weight entre 0 et 1.
Cela a effectivement permis à mon faux "Fragment imbriqué" de fonctionner comme une vue indépendante tant que je gérais manuellement les pondérations de mise en page pertinentes.
Voici mon activity_main.xml:
Notez que "@ + id / pager" et "@ + id / container" sont des frères avec 'android: layout_weight = "0.5"' et 'android: layout_height = "0dp"'. C'est pour que je puisse le voir dans l'aperçu pour n'importe quelle taille d'écran. Leurs poids seront de toute façon manipulés dans le code pendant l'exécution.
la source
SO
que l'utilisation d'ActionBar
onglets avec unNavigation Drawer
n'est pas bon car cela placera automatiquement les onglets sur la vue de votre tiroir. Désolé, je n'ai pas le lien pour sauvegarder cela.En s'appuyant sur la réponse de @ Chris.Jenkins, c'est la solution qui a bien fonctionné pour moi, pour supprimer le ou les fragments pendant les événements du cycle de vie (qui ont tendance à lancer des exceptions IllegalStateExceptions). Cela utilise une combinaison de l'approche Handler et une vérification Activity.isFinishing () (sinon, il générera une erreur pour «Impossible d'exécuter cette action après onSaveInstanceState).
Usage:
la source
Bien que l'OP puisse avoir des circonstances particulières qui l'empêchent d'utiliser la bibliothèque de support, la plupart des gens devraient l'utiliser. La documentation Android le recommande et rendra votre application accessible au public le plus large possible.
Dans ma réponse plus complète ici, j'ai fait un exemple montrant comment utiliser des fragments imbriqués avec la bibliothèque de support.
la source