Aperçu de base des fragments


Introduction à cette section

D'accord, dans le chapitre précédent nous avons mis les quatre composants majeurs d'Android : Activité, Service, BroadCastReceiver, ContentProvider Ainsi que le lien qui les unit : l'intention, nous l'avons tous jouée, et ce chapitre vous apporte un fragment. Dans cette section, nous présenterons quelques concepts de base et l'utilisation de ce fragment ! Document officiel : Fragment


1.Concepts de base

1) Qu'est-ce que c'est et à quoi sert-il ?

Réponse : Fragment est une nouvelle API introduite après Android 3.0. Son intention initiale était de s'adapter aux tablettes grand écran. Bien sûr, c'est toujours le chouchou de la conception de l'interface utilisateur des applications pour tablettes, et notre développement ordinaire de téléphones mobiles ajoutera également ce fragment. On peut le considérer comme une petite activité, également appelée fragment d'activité ! Pensez-y, si une grande interface, nous Avec une seule mise en page, il serait très compliqué d'écrire l'interface, et s'il y a de nombreux composants, ce serait également très compliqué à gérer ! Au lieu d'utiliser Fragment On peut diviser l'écran en plusieurs morceaux puis les regrouper pour une gestion modulaire ! Cela rend plus pratique Mettez à jour dynamiquement l'interface utilisateur de l'activité pendant le fonctionnement ! De plus, Fragment ne peut pas être utilisé seul, il doit être imbriqué dans Activity Utilisé dans, bien qu'il ait son propre cycle de vie, il sera toujours affecté par le cycle de vie de l'activité hôte, telle que l'activité S'il est détruit par destroy, il sera également détruit !

L'image suivante est un Fragment donné dans le document correspondant à différentes situations entre téléphones portables et tablettes :

1.png

PS : Simple La navigation dans l'actualité la page utilise deux fragments pour afficher respectivement la liste des actualités et le contenu des actualités


2) Diagramme du cycle de vie du fragment

2.jpg


3) Noyau points :

Voici quelques points clés de l'utilisation de Fragment :

  • Introduit après la version 3.0, c'est-à-dire que minSdk doit être supérieur à 11
  • Le fragment doit être imbriqué dans Activity Bien sûr, il peut également être imbriqué dans un autre fragment, mais celui-ci est imbriqué Le Fragment doit également être imbriqué dans l'Activité. Indirectement, le Fragment doit toujours être imbriqué dans l'Activité !! Affecté par le cycle de vie de l'activité hôte, il a bien sûr aussi son propre cycle de vie. De plus, il n'est pas recommandé de l'utiliser dans Fragment ! Le fragment imbriqué est dû au fait que le cycle de vie du fragment imbriqué à l'intérieur est incontrôlable !!!
  • Les documents officiels indiquent que lors de la création d'un fragment, au moins trois méthodes doivent être implémentées : onCreate( ), onCreateView( ), OnPause ( ); Mais il semble qu'il soit possible d'en écrire un seul surCreateView...
  • Le cycle de vie du Fragment est quelque peu similaire à l'Activité : trois états :
    Reprise : Le Fragment autorisé est visible
    Pause : L'activité est visible, mais impossible d'obtenir le focus
    Arrêté : ①Appelez addToBackStack() et le fragment est ajouté à la pile Bcak ②L'activité passe en arrière-plan ou le fragment est remplacé/supprimé
    ps : le fragment à l'état arrêté est toujours vivant (tous les statuts et informations sur les membres sont conservés par le système), cependant, il n'est pas utile à l'utilisateur Il n'est plus visible, et si l'activité est tuée, il le sera également

4) Plusieurs sous-classes de Fragment :

ps : Beaucoup. Parfois, nous réécrivons tous directement Fragment, gonfleons, chargeons la mise en page et complétons les activités correspondantes. Les sous-classes ne sont pas beaucoup utilisées et elles seront utilisées en cas de besoin. Il est temps d'approfondir !

  • Dialog :DialogFragment
  • List :ListFragment
  • Paramètres des options : PreferenceFragment
  • Interface WebView :WebViewFragment

5) Utilisez-vous le Fragment sous le package App ou v4 ? Sous le package :

Aperçu du problème :

Je pense que de nombreux amis rencontreront la situation suivante lors de l'utilisation de Fragment :

3.jpg

Alors devrions-nous utiliser le Fragment sous android.app ou le package android.support.v4.app ? Et les fragments ?

Réponse : En fait, tout est possible. Comme mentionné précédemment, Fragment a été introduit après Android 3.0 (API 11), donc si l'application que vous développez le nécessite. Qu'en est-il de fonctionner sur des versions inférieures à 3.0 ? Par exemple, la 2.3 a encore une petite part de marché. Ainsi, le package v4 est né ! Et le minimum est compatible avec la version 1.6 ! Quant au forfait à utiliser, tout dépend de vos besoins. De nos jours, la part de marché des téléphones mobiles de moins de 3.0 est en fait très faible. Elle est d'environ 4.0 et plus, et la version 6.0 sortira en octobre. .. Donc, pour le moment, vous pouvez directement utiliser Fragment sous le package d'application Ensuite, en appelant les méthodes appropriées, il n'y a généralement aucun problème si votre fragment utilise le package d'application, FragmentManager et FragmentTransaction doivent tous deux être dans le package de l'application ! Utilisez soit l'application pour tous, soit la v4 pour tous, Sinon, une erreur sera signalée ! Bien sûr, si vous souhaitez que votre application soit compatible avec les téléphones mobiles de version inférieure, alors vous pouvez choisir d'utiliser le package v4 !

Choses à noter lors de l'utilisation du package v4 pour télécharger des fragments :

  • ① Si vous utilisez Fragment sous le package v4, alors l'activité dans laquelle vous vous trouvez doit hériter de FragmentActivity ! Cas : Aujourd'hui, j'ai chargé le fragment de manière statique dans le fichier XML, puis j'ai réécrit le fragment, mais une erreur a été signalée lors du chargement de l'activité. L'indice général est que l'erreur Fragment n'est toujours pas trouvée ou quelque chose comme ça. L'attribut name a été modifié plusieurs fois et il est toujours faux. Finalement, j'ai découvert que j'avais utilisé ! Grâce au package v4, il vous suffit de changer votre activité en FragmentActivity
  • ② J'ai déjà écrit le code suivant, puis j'ai signalé une erreur :

4.jpg

C'est un peu déroutant. Fragment, FragmentManager et FragmentTransaction utilisent tous le package v4. L'activité hérite également de FragmentActivity ? Remplacez-le simplement par le package d'application, mais celui-ci est différent du package v4 que nous utilisons. Y a-t-il un conflit dans la prémisse ? En fait, il existe une solution ?
Réponse : remplacez simplement getFragmentManager( ) par getSupportFragmentManager( ) et c'est tout


2. Créer un fragment

1) Chargement statique du fragment

Processus de mise en œuvre :

5.png

Exemple de code :

Étape 1 :Définir la disposition du fragment, qui est le contenu affiché par le fragment
Étape 2 :Pour personnaliser une classe Fragment, vous devez hériter de Fragment ou de sa sous-classe et remplacer la méthode onCreateView() Dans cette méthode, appelez : la méthode inflater.inflate() pour charger le fichier de mise en page du Fragment, puis renvoyez l'objet de vue chargé

public class Fragmentone extends Fragment {
@Override
public View onCreateView (gonfleur LayoutInflater, conteneur ViewGroup,
Bundle saveInstanceState) {
View view = inflater.inflate(R.layout.fragment1, containers,false);
return view;

}

Étape 3 :Ajoutez la balise fragment dans le fichier de mise en page correspondant à l'activité qui doit charger le fragment. N'oubliez pas que l'attribut name est un nom de classe complet, ce qui signifie qu'il doit inclure le nom du package du fragment, tel que :

<fragment
android:id="@+id /fragment1"
android:name="com.jay.example.fragmentdemo.Fragmentone"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1 " />

Étape 4 : L'activité appelle setContentView() dans la méthode onCreate() pour charger le fichier de mise en page !


2) Charger dynamiquement Fragment

Processus de mise en œuvre :

7.png

Exemple de code : Ce qui est démontré ici est lors du basculement entre les écrans horizontaux et verticaux . Switch Fragment :

6.gif

Le fragment et le code de mise en page ne seront pas publiés. Collez directement le code clé de MainActivity :

classe publique MainActivity extends. Activité {

@Override
protected void onCreate(Bundle savingInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Display dis = getWindowManager () .getDefaultDisplay();
if(dis.getWidth() > dis.getHeight())
{
Fragment1 f1 = new Fragment1();
getFrag mentManager().beginTransaction( .replace (R.id.LinearLayout1, f1).commit();
                                                                                                                              🎜> getFragmentManager().beginTransaction() .replace(R.id.LinearLayout1, f2).commit();
                                                               

3. Gestion des fragments et transactions de fragments

8.png


4. Interaction entre le fragment et l'activité

9.png

Certains amis n'aiment peut-être pas voir des images, alors présentons-le avec des mots :

1) Acquisition de composants

Fragment obtient des composants dans Activity : getActivity() (findViewById). R.id.list);
Activity récupère les composants dans Fragment (selon l'identifiant et la balise) : getFragmentManager.findFragmentByid(R.id.fragment1);


2) Transfert de données

①Activit transmet les données à Fragment :

Créez un package de données Bundle dans Activity et appelez setArguments de l'instance Fragment (bundle ) Ainsi, le paquet de données Bundle est transmis au fragment, puis getArguments est appelé dans le fragment pour obtenir Regroupez l'objet, puis analysez-le

②Fragment transmet les données à l'activité

Définissez une interface de rappel interne dans le fragment, puis laissez-le inclure L'activité du fragment implémente l'interface de rappel. Fragment peut transférer des données via l'interface de rappel, je pense que beaucoup de gens savent ce que c'est, mais. Je ne peux pas l'écrire. Le « fragment transfère des données vers l'activité » de Baidu sur Internet est tout le code du professeur Li Gang, je suis vraiment sans voix. Oubliez ça, écrivons simplement le code partiel ici. Je pense que les lecteurs le comprendront d'un coup d'œil :

Étape 1 : Définir une interface de rappel : (dans Fragment)

/*Interface*/
public interface CallBack{
/*Définir une méthode pour obtenir des informations*/
public void getResult(String result); >
Étape 2 : Rappel d'interface (dans Fragment)

/*Rappel d'interface*/
public void getData(CallBack callBack){
/ *Récupérez les informations de la zone de texte, bien sûr vous pouvez également passer d'autres types de paramètres, selon vos besoins*/
String msg = editText.getText().toString(); (msg);
>

Étape 3 : Utilisez la méthode de rappel d'interface pour lire les données (dans Activité)

/* Utilisez la méthode de rappel d'interface pour obtenir des données */
leftFragment. getData(new CallBack() {
@Override
public void getResult(String result) { /*Imprimer les informations*/
Toast.makeText(MainActivity.this, "-->>" + résultat , 1) .show();
}
  });

Pour résumer la méthode : ->Définir une interface dans Fragment, interface Définissez une méthode abstraite dans l'interface et définissez le type de paramètres de données que vous souhaitez transmettre
->Écrivez ensuite une méthode abstraite dans l'interface d'appel et transmettez les données à être passé
->L'étape suivante est Activity, appelez la méthode fournie par Fragment, puis traitez les données lors du remplacement de la méthode abstraite Il suffit de lire !!!

③Transfert de données entre fragment et fragment

En fait, c'est très simple, trouvez le fragment pour accepter l'objet de données, il suffit appelez setArguments directement pour transmettre les données. Habituellement, lors du remplacement, c'est-à-dire que les données sont transférées lorsque le fragment saute, il vous suffit alors d'initialiser le fragment à sauter. Appelez ensuite sa méthode setArguments pour transmettre les données !
Si deux fragments doivent transmettre des données immédiatement au lieu de sauter, vous devez d'abord récupérer les données transmises par f1 dans Activity. Ensuite, transmettez-le à f2, en utilisant Activity comme support ~

L'exemple de code est le suivant :

FragmentManager fManager = getSupportFragmentManager( );
FragmentTransaction fTransaction = fManager.beginTransaction();
Fragmenttrois t1 = new Fragmenttrois();
Fragmenttwo t2 = new Fragmenttwo();
Bundle bundle = new Bundle();
bundle. putString(" key",id);
t2.setArguments(bundle);
fTransaction.add(R.id.fragmentRoot, t2, "~~~"); ;
fTransaction.commit();

5. Parcourez le diagramme du cycle de vie :

Après mûre réflexion, j'ai décidé de vous présenter un diagramme du cycle de vie simple pour approfondir votre compréhension du cycle de vie du fragment :

①Lorsque l'activité charge Fragment, elle appelle les méthodes suivantes dans l'ordre : onAttach -> onCreate -> onActivityCreated -> onStart ->onResume②Lorsque nous créons une activité de type dialogue suspendue, ou autre, c'est là que Le fragment est localisé L'activité est visible, mais n'obtient pas le focus

onPause

③Lorsque la boîte de dialogue est fermée, l'activité retrouve le focus :

onResume

④Lorsque nous remplaçons Fragment et appelons addToBackStack() pour l'ajouter à la pile Back

onPause -> onStop -> onDestoryView

 ! ! Remarque, le fragment à ce moment n'a pas encore été détruit !!!⑤Lorsque nous appuyons sur la touche retour du clavier, le fragment s'affichera à nouveau :

onCreateView -> ; onActivityCreated -> onStart -> onResume

⑥Si après le remplacement, la méthode addToBackStack()

n'est pas appelée avant la validation de la transaction

Si le fragment est ajouté à la pile arrière ; ou si l'activité est quittée, le fragment sera complètement terminé. Le fragment entrera dans l'état de destruction onPause -> onStop -> onDestoryView -> Résumé de cette section :

Cette section vous explique quelques concepts de base et une utilisation simple du fragment suivant, je pense que vous le ferez progressivement. comme ça. Fragment, en raison de sa longueur, j'écrirai beaucoup de choses dans cette section. Dans la section suivante, nous vous amènerons à écrire quelque chose sur Fragment. Exemples couramment utilisés, restez à l'écoute, merci ~