Android - j'ai besoin de quelques clarifications de fragments vs activités et vues
dans Android API 11+, Google a publié une nouvelle classe appelée Fragment
.
dans les vidéos, Google suggère que chaque fois que possible ( link1 , link2 ), nous devrions utiliser des fragments plutôt que des activités, mais ils n'ont pas expliqué exactement pourquoi.
Quel est le but des fragments et de quelques utilisations possibles de ceux-ci (autres que quelques exemples D'UI qui peuvent être facilement obtenus par des vues simples/layouts)?
ma question porte sur des fragments:
- Quel est le but de l'utilisation d'un fragment?
- Quels sont les avantages et les inconvénients de l'utilisation de fragments par rapport à l'utilisation d'activités/vues/mises en page?
questions Bonus:
- Pouvez-vous donner quelques vraiment intéressant utilise des fragments? Des choses que Google n'a pas mentionnées dans leurs vidéos?
- Quelle est la meilleure façon de communiquer entre les fragments et les activités qui en contiennent?
- Quelles sont les choses les plus importantes à retenir lorsque vous utilisez des fragments? Des conseils et des avertissements de votre expérience?
12 réponses
#1 & #2 Quels sont les buts de l'utilisation d'un fragment et quels sont les avantages et inconvénients de l'utilisation de fragments par rapport à l'utilisation activités/views/layouts?
Fragments sont la solution D'Android pour créer des interfaces utilisateur réutilisables. Vous pouvez réaliser certaines des mêmes choses en utilisant des activités et des mises en page (par exemple en utilisant des includes). Cependant, les fragments sont connectés à L'API Android, à partir de HoneyComb, et plus haut. Permettez-moi de elaborate;
-
Le
ActionBar
. Si vous voulez des onglets là-haut pour naviguer dans votre application, vous voyez rapidement queActionBar.TabListener
interface vous donne unFragmentTransaction
comme argument d'entrée à la méthodeonTabSelected
. Vous pourriez probablement ignorer cela, et faire quelque chose d'autre et intelligent, mais vous travailleriez contre L'API, pas avec elle. -
le
FragmentManager
poignées "arrière" pour vous d'une manière très intelligente. Arrière ne signifie pas Retour à la dernière activité, comme pour les activités régulières. Ça veut dire revenir à l'état de fragment précédent. -
vous pouvez utiliser le cool
ViewPager
avec unFragmentPagerAdapter
pour créer des interfaces de balayage. Le codeFragmentPagerAdapter
est beaucoup plus propre qu'un adaptateur ordinaire, et il contrôle les instanciations des fragments individuels. -
Votre vie sera beaucoup plus facile si vous utilisez des Fragments lorsque vous essayez de créer des applications pour les téléphones et les tablettes. Puisque les fragments sont tellement liés avec les APIs Honeycomb+, vous voudrez les utiliser sur les téléphones aussi bien pour réutiliser le code. C'est là que la bibliothèque de compatibilité est très pratique.
-
vous pouvez même utiliser des fragments pour des applications destinées aux téléphones seulement. Si vous avez la portabilité à l'esprit. J'utilise
ActionBarSherlock
et les bibliothèques de compatibilité pour créer des applications" ICS looking", qui ressemblent toutes le retour à la version 1.6. Vous obtenez les dernières fonctionnalités comme leActionBar
, avec des onglets, overflow, split action bar, viewpager etc.
Bonus 2
la meilleure façon de communiquer entre les fragments sont les intentions. Quand vous appuyez sur quelque chose dans un Fragment vous appelleriez typiquement StartActivity()
avec des données dessus. L'intention est transmis à tous les fragments de l'activité que vous lancez.
-
Fragment est une partie d'une activité, qui contribue son propre UI à cette activité. Fragment peut être considéré comme une sous-activité. Où comme l'écran complet avec lequel l'utilisateur interagit est appelé activité. Une activité peut contenir plusieurs fragments.Les Fragments sont surtout une sous-partie d'une activité.
-
une activité peut contenir 0 ou plusieurs fragments selon la taille de l'écran. Un fragment peut être réutilisé dans les activités multiples, il agit donc comme une composante réutilisable dans les activités.
-
un fragment ne peut exister indépendamment. Cela devrait toujours faire partie d'une activité. Où l'activité as peut exister sans aucun fragment.
Je ne sais pas à quelle(S) vidéo (s) vous faites référence, mais je doute qu'ils disent que vous devriez utiliser des fragments plutôt que des activités, parce qu'ils ne sont pas directement interchangeables. Il ya en fait un assez entrée détaillée dans le guide de Dev, envisager de lire pour plus de détails.
en bref, les fragments vivent à l'intérieur des activités, et chaque activité peut accueillir de nombreux fragments. Comme les activités, ils ont un cycle de vie spécifique, contrairement aux activités, ils ne sont pas composants d'application de haut niveau. Les avantages des fragments comprennent la réutilisation de code et la modularité (par exemple, en utilisant la même vue de liste dans de nombreuses activités), y compris la capacité de construire des interfaces à plusieurs volets (surtout utile sur les tablettes). Le principal inconvénient est la complexité accrue. Vous pouvez généralement obtenir la même chose avec des vues (personnalisées) d'une manière non standard et moins robuste.
un Fragment est un élément de l'interface utilisateur ou du comportement d'une application qui peut être placé dans une activité qui permet un design d'activité plus modulaire. Il ne sera pas faux de dire qu'un fragment est une sorte de sous-activité.
ce qui suit sont des points importants à propos d'un fragment:
-
un fragment a sa propre disposition et son propre comportement avec ses propres callbacks lifecycle.
-
Vous pouvez ajouter ou supprimer des fragments dans une activité alors que l'activité est en cours d'exécution.
-
vous pouvez combiner plusieurs fragments dans une seule activité pour construire une interface multi-volets.
-
un fragment peut être utilisé dans plusieurs activités.
-
le cycle de vie du fragment est étroitement lié au cycle de vie de son activité hôte.
-
Lorsque l'activité est interrompue, tous les fragments disponibles dans l'acidité seront également arrêtés.
-
un fragment peut implémenter un comportement qui n'a aucun composant d'interface utilisateur.
Les Fragments -
ont été ajoutés à L'API Android dans Android 3 (Honeycomb) avec la version 11 de L'API.
Pour plus de détails, veuillez visiter le site officiel, Fragments .
c'est une information importante que j'ai trouvé sur des fragments:
historiquement, chaque écran d'une application Android a été implémenté comme une activité distincte. Cela crée un défi dans la transmission de l'information entre les écrans parce que le mécanisme D'intention Android ne permet pas de passer un type de référence (c.-à-d. objet) directement entre les activités. Au lieu de cela, l'objet doit être sérialisé ou une référence globalement accessible doit être mise à disposition.
en faisant chaque écran Un Fragment séparé, ces données passant maux de tête est complètement évité. Fragments existent toujours dans le contexte d'une et peut toujours accéder à cette activité. Par le stockage de la informations d'intérêt au sein de l'activité, le Fragment pour chaque l'écran peut simplement accéder à la référence de l'objet par le biais de l'Activité.
Fragments sont d'une utilité particulière dans certains cas comme où nous voulons garder un tiroir de navigation dans toutes nos pages. Vous pouvez gonfler une mise en page de cadre avec n'importe quel fragment que vous voulez et avoir toujours accès au tiroir de navigation.
si vous aviez utilisé une activité, vous auriez dû garder le tiroir dans toutes les activités qui rend le code redondant. C'est une utilisation intéressante d'un fragment.
Je suis nouveau sur Android et je pense toujours qu'un fragment est utile de cette façon.
je sais que cela a déjà été discuté à mort, mais je voudrais ajouter quelques points:
-
les chiffons peuvent être utilisés pour peupler
Menu
s et peuvent gérerMenuItem
clics sur leur propre. Donnant ainsi des options de modulation supplémentaires pour vos activités. Vous pouvez faire des choses ContextualActionBar et ainsi de suite sans que votre activité le sache et vous pouvez le découpler des choses de base que votre activité gère (Navigation/Paramètres/À propos). -
un fragment parent avec des Frags enfant peut vous donner d'autres options pour moduliser vos composants. Par exemple: vous pouvez facilement échanger des Frags autour, mettre de nouveaux Frags à l'intérieur d'un Pager ou les enlever, les réorganiser. Tout cela sans que votre activité soit au courant de quoi que ce soit à ce sujet, se concentrant simplement sur les choses de niveau supérieur.
un Fragment représente un comportement ou une partie de l'interface utilisateur dans une activité. Vous pouvez combiner plusieurs fragments dans une seule activité pour construire une interface multi-pane et réutiliser un fragment dans plusieurs activités. Vous pouvez penser à un fragment comme une section modulaire d'une activité, qui a son propre cycle de vie, reçoit ses propres événements d'entrée, et que vous pouvez ajouter ou supprimer pendant que l'activité est en cours d'exécution.
-
vous pouvez manipuler chaque fragment indépendamment, comme ajouter ou supprimer. Lorsque vous effectuez une telle transaction de fragment, vous pouvez également l'ajouter à une pile arrière qui est gérée par l'activité-chaque entrée de pile arrière dans l'activité est un enregistrement de la transaction de fragment qui s'est produite. La pile de retour permet à l'utilisateur d'inverser une transaction de fragment (naviguer à l'envers), en appuyant sur le bouton de retour.
-
lorsque vous ajoutez un fragment dans le cadre de votre mise en page d'activités, il vit dans un ViewGroup à l'intérieur de la hiérarchie de vue de l'activité et le fragment définit sa propre disposition de vue. Vous pouvez insérer un fragment dans votre activité mise en déclarant le fragment dans l'activité du fichier de mise en page, comme un élément, ou à partir de votre code d'application en l'ajoutant à un ViewGroup. Cependant, un fragment n'est pas nécessaire d'être une partie de l'activité mise en page; vous pouvez également utiliser un fragment sans sa propre INTERFACE utilisateur invisible travailleur de l'activité.
-
par exemple: Si vous utilisez NavigationDrawer sans Fragments, alors il serait préférable de garder L'instance NavigationDrawer dans une seule activité et lorsque vous naviguez dans l'application en choisissant parmi les éléments de NavigationDrawer, alors chacune des activités qui sont lancées ne devrait pas mettre en œuvre la NavigationDrawer, mais plutôt devrait mettre en œuvre le bouton arrière pour naviguer de nouveau vers la "principale"/unique activité que la NavigationDrawer a été mis en œuvre.
Note: Si vous souhaitez mettre en œuvre la NavigationDrawer dans plusieurs activités, vous devez recréer une nouvelle instance de la NavigationDrawer dans chaque activité que vous souhaitez l'afficher.
je suppose que ce serait un inconvénient vs utiliser des Fragments alors que si vous utilisiez un fragment vous n'auriez pas besoin de plusieurs instances du tiroir vous n'en auriez besoin que d'un seul.
tiroir avec Fragments au lieu d'activités
si vous utilisez le navigateur avec des Fragments, puis le tiroir doit être mis en œuvre dans une seule activité et lorsque chaque élément de tiroir est sélectionné, leur contenu est affiché dans chacun de leurs propres Fragments.
-
communiquer entre fragment à son activité : Pour permettre à un Fragment de communiquer jusqu'à son activité, vous pouvez définir une interface dans la classe Fragment et l'implémenter dans L'activité.Le Fragment capte le mise en œuvre de l'interface au cours de sa méthode de cycle de vie onAttach() et peut ensuite appeler les méthodes D'Interface afin de communiquer avec l'activité.
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"); } } }...
maintenant le fragment peut délivrer des messages à l'activité en appelant la méthode onItemSelected () (ou d'autres méthodes dans l'interface) en utilisant l'instance mCallback de l'interface 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 fragment vit à l'intérieur d'une activité.
pendant qu'une activité vit sur elle-même.
Fragments vit dans l'activité et a:
- son propre cycle de vie
- sa propre disposition
- ses propres fragments d'enfant et etc.
penser aux Fragments comme une sous-activité de l'activité principale à laquelle il appartient, il ne peut pas exister de son propre et il peut être appelé/réutilisé encore et encore. Espérons que cela aide :)
1.Fins de l'utilisation d'un fragment?
- Ans:
- traitant des différences entre les facteurs de forme des appareils.
- passer des informations entre les écrans de l'application.
- de l'interface Utilisateur de l'organisation.
- métaphores avancées de L'UI.
activité sont les composants plein écran dans l'application avec la barre d'outils, tout le reste sont de préférence des Fragments. Une activité parent plein écran avec une barre d'outils peut avoir plusieurs fenêtres, des pages scrollables, des dialogues, etc. (tous les fragments) qui sont accessibles depuis le parent et communiquent via le parent.
exemple -
Activité A, Activité B, Activité C -
- tous les activités doivent avoir le même code répété, pour montrer un toolbar par exemple ou hériter d'une activité parent (devient lourd à gérer).
- Pour passer d'une activité à l'autre, ils ont tous besoin d'être dans la mémoire (frais généraux) ou d'un service qui doit être détruit pour l'autre pour l'ouvrir.
- la Communication entre les activités peut se faire par le biais D'intentions.
vs
Activité A, Fragment 1, Fragment 2, Fragment 3 -
- pas de répétition de code, tous les écrans ont des barres d'outils, etc. à partir de cette seule Activité.
- plusieurs façons de passer d'un fragment à un autre - pager view, multi-pane etc. L'activité
- possède la plupart des données, de sorte que la communication entre fragments est minime. Si encore nécessaire, peut être fait via des interfaces facilement.
- Fragments n'ont pas besoin d'être plein écran, charge de flexibilité dans leur conception. Les Fragments
- n'ont pas besoin de gonfler la disposition si les vues ne sont pas nécessaires.
- plusieurs activités peuvent utiliser le même fragment.