[JAVA] Notions de base sur les fragments

Environnement de vérification

Le contenu de cet article a été vérifié dans l'environnement suivant.

Qu'est-ce qu'un fragment

Comment créer un fragment

Créez une sous-classe Fragment comme Activity. La classe Fragment existe dans les packages android.app et android.support.v4.app, Vous devez utiliser la classe de fragments de support v4. La classe Fragment qui corrige un bogue dans la classe Fragment du package android.app est stockée dans le support v4.

Méthode du cycle de vie

Comme l'activité, il y a un cycle de vie. La méthode du cycle de vie est profondément liée au cycle de vie de l'activité. Voici l'ordre dans lequel le fragment est ajouté par onCreate of Activity. Si la balise de fragment est décrite dans le fichier de mise en page de Activity et que le nom de classe complet de la classe de fragment est décrit dans l'attribut name, l'ordre n'est pas le suivant.

Méthode pour passer au premier plan

Méthode La description
onAttach(Activity)
* API niveau 23 ou supérieur sur Attach(Context)
Méthode appelée lorsqu'elle est associée à une activité
onCreate(Bundle) Méthode appelée lors de la génération d'un fragment
onCreateView(LayoutInflater, ViewGroup, Bundle) Méthode appelée lors de la création d'une vue à afficher sous forme de fragment
onActivityCreated(Bundle) Méthode appelée lorsque le traitement de la méthode onCreate d'Activité est terminé
onViewStateRestored(Bundle) Méthode appelée lorsque la restauration du fragment enregistré dans l'état est terminée
onStart() Une méthode qui est appelée après l'exécution de la méthode onStart d'Activité et traite l'affichage de l'écran pour l'utilisateur.
onResume() Il est appelé après l'exécution de la méthode onResume d'Activité et attend un événement de l'utilisateur une fois le traitement terminé.

Méthode pour être en arrière-plan

Méthode La description
onPause() Appelé juste avant l'exécution de la méthode onPause de l'activité.
onStop() Appelé juste avant l'exécution de la méthode onStop de Activity.
onDestroyView() Appelé avant la méthode onDestroy de Activity. Méthode appelée lors du nettoyage de la vue associée au fragment
onDestroy() Appelé avant la méthode onDestroy de Activity. Méthode appelée lors du nettoyage de l'état du fragment
onDetach() Appelé avant la méthode onDestroy de Activity. Une méthode appelée lors de la rupture de la connexion avec Activity

Exemple d'application utilisant Fragment

Spécifications de l'application

Une application qui prépare un bouton et lorsque le bouton est enfoncé, un Fragment correspondant au bouton est généré et remplacé.

Image complète

Fragment_01.png

Fragment affiché lorsque le bouton est enfoncé

Bouton d'informations personnelles

Fichier de mise en page

fragment_user_info.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="jp.co.casareal.sample.fragmentsample.fragment.UserInfoFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Nom: Casa Real Taro" />
    <TextView
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Age: 33 ans" />

</LinearLayout>

Code source Java

UserInfoFragment.java


package jp.co.casareal.sample.fragmentsample.fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import jp.co.casareal.sample.fragmentsample.R;

public class UserInfoFragment extends Fragment {


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_user_info, container, false);
    }

}

Bouton de couleur préférée

Fichier de mise en page

fragment_color.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="jp.co.casareal.sample.fragmentsample.fragment.ColorFragment">

    <!-- TODO: Update blank fragment layout -->
    <TextView
        android:textSize="20sp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Couleur préférée: orange" />

</LinearLayout>

Code source Java

ColorFragment.java


package jp.co.casareal.sample.fragmentsample.fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import jp.co.casareal.sample.fragmentsample.R;

public class ColorFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_color, container, false);
    }
}

Fragment pour afficher 4 boutons

La partie qui affiche les quatre boutons est également créée avec Fragmet. Comme un point ici, la méthode de la chaîne de caractères qui a été définie sur l'attribut onClick de la balise Button Si elle est définie, il s'agit d'une spécification liée, mais la classe qui implémente la méthode de l'attribut onClick doit être une activité contenant un fragment. </ b> Si vous l'implémentez avec Fragment, vous devez obtenir View avec findViewById et le définir avec setOnClickListener sans Fragment.

Fichier de mise en page

fragment_menu.xml


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal" android:layout_width="match_parent"
    android:layout_height="match_parent">

        <Button
            android:onClick="onClickUserInfo"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.25"
            android:id="@+id/userInfoButton"
            android:text="@string/btnUserInfo"
            />
        <Button
            android:onClick="onClickColor"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.25"
            android:id="@+id/colorButton"
            android:text="@string/btnColor"
            />


        <Button
            android:onClick="onClickDrink"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.25"
            android:id="@+id/drinkButton"
            android:text="@string/btnDrink"
            />
        <Button
            android:onClick="onClickFood"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="0.25"
            android:id="@+id/foodButton"
            android:text="@string/btnFood"
            />

</LinearLayout>

Code source Java

MenuFragment.java


package jp.co.casareal.sample.fragmentsample.fragment;

import android.app.Activity;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;

import jp.co.casareal.sample.fragmentsample.R;


public class MenuFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
       return inflater.inflate(R.layout.fragment_menu, container, false);
    }


}

Activités qui composent tout l'écran

Balise de fragment

Le fragment qui affiche quatre boutons est décrit par la balise et lié à Java par l'attribut name. L'identifiant est spécifié dans l'attribut id afin que le Frament affiché lorsque le bouton est enfoncé puisse être remplacé dynamiquement.

Remplacement du fragment

Appelez la méthode beginTransaction () de la classe FragmentManager pour obtenir le FragmentTransaction. Le fragment est remplacé par la méthode replace (). Après avoir défini le Fragment, appelez la méthode commit (). De plus, si vous souhaitez afficher le fragment précédent lorsque vous appuyez sur le bouton de retour, vous pouvez utiliser la synchronisation du paramètre Fragment. Doit être enregistré dans la pile arrière avec la méthode addToBackStack ().

Fichier de mise en page

activity_main.xml



<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="jp.co.casareal.sample.fragmentsample.MainActivity">

    <FrameLayout
        android:id="@+id/menuFrame"
        android:layout_width="368dp"
        android:layout_height="wrap_content"
        android:layout_marginRight="8dp"
        app:layout_constraintRight_toRightOf="parent"
        android:layout_marginLeft="8dp"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        android:layout_marginTop="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginEnd="8dp">

    <fragment
        android:id="@+id/menuFragment"
        android:name="jp.co.casareal.sample.fragmentsample.fragment.MenuFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_menu"
        />
    </FrameLayout>

    <FrameLayout
        android:id="@+id/contents"
        android:layout_width="368dp"
        android:layout_height="417dp"

        android:layout_marginBottom="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/menuFrame"
        app:layout_constraintVertical_bias="0.0" />
</android.support.constraint.ConstraintLayout>

Code source Java

MainActivity.java


package jp.co.casareal.sample.fragmentsample;




import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import jp.co.casareal.sample.fragmentsample.fragment.ColorFragment;
import jp.co.casareal.sample.fragmentsample.fragment.DrinkFragment;
import jp.co.casareal.sample.fragmentsample.fragment.FoodFragment;
import jp.co.casareal.sample.fragmentsample.fragment.UserInfoFragment;

public class MainActivity extends AppCompatActivity {

    private FragmentManager fragmentManager;

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

    public void onClickUserInfo(View view) {
        Fragment fragment = new UserInfoFragment();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.contents,fragment );
        transaction.addToBackStack(null);
        transaction.commit();
    }

    public void onClickColor(View view) {
        Fragment fragment = new ColorFragment();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.contents,fragment );
        transaction.addToBackStack(null);
        transaction.commit();
    }

    public void onClickDrink(View view) {
        Fragment fragment = new DrinkFragment();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.contents,fragment );
        transaction.addToBackStack(null);
        transaction.commit();

    }

    public void onClickFood(View view) {
        Fragment fragment = new FoodFragment();
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(R.id.contents,fragment );
        transaction.addToBackStack(null);
        transaction.commit();
    }
}


référence

https://developer.android.com/guide/components/fragments.html

Recommended Posts

Notions de base sur les fragments
Notions de base sur les rails
Bases de Ruby
Principes de base de JPA 1
Principes de base de Docker
Principes de base de ViewPager
Les bases de Java
Les bases de Java
Bases de JavaScript
Principes de base de JPA 2
Les bases de Java
Principes de base de RecyclerView
Rails CSV Basic
Principes de base du routage des rails
Principes de base de la base de données Rails
Principes de base de l'enregistreur de rails
bases de la programmation Java
Bases de Ruby
Principes de base de Java JAR
Notions de base orientées objet (Java)
bases de vim (gitbush)
Bases des expressions régulières
Principes de base du traitement parallèle Java
Principes de base de Rspec [Rails]
Principes de base de l'API Stream