[Explication du fragment d'Android et pratique simple de l'effet de changement de page d'historique]

teneur

Chapitre 1 Aperçu

La deuxième partie de l'effet d'échantillon

Le troisième cycle de vie

Section 4 Effets pratiques


Chapitre 1 Aperçu

Tout d'abord, posez une question, qu'est-ce que Fragment ?

Le fragment est un fragment d'interface utilisateur qui peut être intégré à l'activité. Il peut permettre au programme d'utiliser de manière plus raisonnable et complète l'espace grand écran , car il est largement utilisé sur la tablette.

 Vous êtes peut-être un peu confus ici, que diable? Voici un exemple : Imaginons que nous développions une page qui utilise RecyclerView pour afficher un ensemble de titres d'actualité. Lorsque l'un des titres est cliqué, une autre interface s'ouvre pour afficher les détails de l'actualité . S'il est conçu dans un téléphone mobile, nous pouvons mettre la liste des titres de l'actualité dans une activité et les détails de l'actualité dans une autre activité, comme le montre la figure.

Cela ne semble pas être un problème, mais lorsque nous déplaçons le code source sur la tablette, le titre de l'actualité s'étendra sur tout l'écran (très moche) et il y aura une grande zone vide . Comme le montre la figure :

Par conséquent, lors du développement, utilisez Fragment raisonnablement pour réduire les coûts de code.

Par conséquent, une meilleure solution consiste à placer l'interface de liste de titres et l'interface de contenu détaillé dans deux fragments respectivement, puis à introduire ces deux fragments dans la même activité, afin que l'espace de l'écran puisse être pleinement utilisé. Comme le montre la figure :

La deuxième partie de l'effet d'échantillon

Alors, comment utiliser ce Fragment ? Voyons d'abord l'effet de l'échantillon :

 Créez d'abord un Fragment (Blank) appelé   BlankFragment . À ce stade, AS créera automatiquement un fichier appelé fragment_blank.xml. Dans le fichier fragment_blank.xml, nous écrivons un contrôle de texte (TextView) et un contrôle de bouton (Button) :

    <TextView
        android:id="@+id/textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="到底要选那个呢?"
        android:gravity="center"
        android:textSize="40sp"/>

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="我是按钮"
        android:layout_gravity="center" />

Nous écrivons dans le fichier BlankFragment.java :

package com.example.a2241;

import android.os.Bundle;

import androidx.fragment.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class BlankFragment extends Fragment {

    private View root;
    private TextView textView;
    private Button button;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (root == null){
            root = inflater.inflate(R.layout.fragment_blank,container,false);
        }// 这里 inflater.inflate 的用法可以看看这位大佬写的讲解
        //  https://www.cnblogs.com/qinaidexin/p/11726296.html  
        textView = root.findViewById(R.id.textview);// 得到id  textview
        button = root.findViewById(R.id.btn); // 得到id  btn
        button.setOnClickListener(new View.OnClickListener() {// 设置按钮的点击效果事件
            @Override
            public void onClick(View view) {
                textView.setText("发生什么事了?");
            }
        });
        return root;
    }
}

Écrivez dans le fichier Acticity_main.xml :

    <fragment android:name="com.example.a2241.BlankFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/fragment"/>

 Ici, nous pouvons voir que seul un fragment est défini ici, comment peut-il y avoir un tel effet ? La compréhension personnelle ici est de renvoyer fragment_blank.xml à Acticity_main.xml puis de l'afficher (en cas d'erreur, veuillez envoyer un message privé pour obtenir des conseils).

Le troisième cycle de vie

Grâce à ce qui précède, nous connaissons l'utilisation de Fragment, examinons le cycle de vie de Fragment.

Il existe quatre types de cycle de vie d'activité : l'état d'exécution, l'état de pause, l'état d'arrêt et l'état de destruction .

Le cycle de vie du fragment comprend l'état d'exécution, l'état suspendu, l'état arrêté et l'état détruit . Comme le montre la figure :

Fonctions de onAttach() et onDetach() : L'exécution de Fragment doit dépendre de l'Activity. S'il n'y a pas d'Activity, il n'y aura pas de Fragment. Comment identifier s'ils sont liés ? Le rôle de onAttach() est de lier, et le rôle de onDetach() est de délier.

Le rôle de onCreate() et onDestroy() : onCreate() Création de Fragment, onDestroy() Destruction de Fragment.

Le rôle de onCreateView() et onDestroyView() : onCreateView() crée Fragment UI, et onDestroyView() détruit Fragment UI.

onActivityCreate() Fonction : Signifie que l'activité est créée.

Il ne reste plus qu'à : démarrer, redémarrer, mettre en pause, arrêter.

Regardons le cycle de vie :

Toujours le projet à l'instant, nous continuons à écrire du code dans le fichier BlankFragment.java :

package com.example.a2241;

import static androidx.constraintlayout.motion.utils.Oscillator.TAG;

import android.content.Context;
import android.nfc.Tag;
import android.os.Bundle;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class BlankFragment extends Fragment {

    private View root;
    private TextView textView;
    private Button button;
  //  private String string = "1";

    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG,"onCreate: ");
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (root == null){
            root = inflater.inflate(R.layout.fragment_blank,container,false);
        }// 这里 inflater.inflate 的用法可以看看这位大佬写的讲解
        //  https://www.cnblogs.com/qinaidexin/p/11726296.html
        textView = root.findViewById(R.id.textview);// 得到id  textview
        button = root.findViewById(R.id.btn); // 得到id  btn
        button.setOnClickListener(new View.OnClickListener() {// 设置按钮的点击效果事件
            @Override
            public void onClick(View view) {
                textView.setText("发生什么事了?");
            }
        });
        Log.d(TAG,"onCreateView: ");
        return root;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        Log.d(TAG, "onActivityCreated: ");
    }

    @Override
    public void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");
    }

    @Override
    public void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    public void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: ");
    }

    @Override
    public void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        Log.d(TAG, "onDestroyView: ");
    }

    @Override
    public void onDetach() {
        super.onDetach();
        Log.d(TAG, "onDetach: ");
    }
}

Nous cliquons sur le bouton Exécuter. Ouvrez logcat pour jeter un œil.

Une application de démarrage appellera. onCreate, onCreate, onActivityCreated, onStart, onResume .

 Donnez la conclusion directement (le code ne sera pas affiché un par un)

Section 4 Effets pratiques

Jetons un coup d'œil à l'effet pratique (effet de changement de page simple):

 Ici, ma séquence de clics est : bouton 1 deux fois, bouton 2 deux fois, bouton 1 ci-dessous, bouton 2 une fois.

La séquence d'appui sur la touche retour est la suivante : bouton 1, bouton 2, bouton 2, bouton 2, bouton 2 .

Alors comment y parvenir ?

Créez deux fragments BlankFragment (Blank), l'un s'appelle BlankFragment1 et l'autre s'appelle BlankFragment2.

BlankFragment1 créera le fichier fragment_blank1.xml. Nous écrivons directement le code:

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="我是第一个界面"
        android:textSize="30sp"/>

Il en va de même pour fragment_blank2.xml :

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="我是第二个界面"
        android:textSize="30sp" />

Écrivez dans activity_main.xml :

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn1"
        android:text="@string/_1"/>

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/btn2"
        android:text="@string/_2"/>

    <FrameLayout
        android:id="@+id/fragme_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/teal_200" />

Écrivez le code dans MainActivity.java :

package com.example.a2022330;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;

import com.example.a2022330.placeholder.BlankFragment2;

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button button = findViewById(R.id.btn1);
        button.setOnClickListener(this);

        Button button1 = findViewById(R.id.btn2);
        button1.setOnClickListener(this);
    }
    
    public void onClick(View view){
        switch (view.getId()){
            case R.id.btn1:
                replaceFragment(new BlankFragment1());//创建 BlankFragment1()
                break;

            case R.id.btn2:
               replaceFragment(new BlankFragment2());
               break;
        }
    }

    private void replaceFragment(Fragment fragment) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.fragme_layout,fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }
}

Cliquez simplement sur Exécuter.

J'ai fini d'écrire, si vous trouvez cet article utile, vous pouvez faire attention, (il y en aura un autre demain), (peut-être pas finir d'écrire, woo woo woo) . Je suis allé manger, hhh~

Je suppose que tu aimes

Origine blog.csdn.net/aasd23/article/details/123901535
conseillé
Classement