Actualiser contenu fragment par rapport à un autre fragment

Résolu
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024 - 17 déc. 2023 à 18:07
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024 - 21 déc. 2023 à 16:40

Bonjour,

malgré mes recherches et après avoir lu et essayer de nombreux codes je me tourne vers vous pour me proposer une idée.

voici comment est structuré mon projet:

j'ai une classActivity avec un tabLayout de 4 onglets.

Tab1 doit communiquer des infos à Tab2 puis Tab2 à Tab3.

Tab1 doit envoyer le contenu de 4 textview et d'un choix Radiobutton via un bouton à Tab2 pour initialiser un recyclerview aprés chaque modifications de ces données.

ClassActivity.java

package fr.xx.xxx.activities;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager2.widget.ViewPager2;

import com.google.android.material.tabs.TabLayout;

import fr.xx.xxx.R;
import fr.xx.xxx.adapters.ViewPagerAdapter;
import fr.xx.xxx.databinding.ActivityClassBinding;
import fr.xx.xxx.utilities.Constants;

public class ActivityClass extends AppCompatActivity {

    TabLayout tabLayout;
    ViewPager2 viewPager2;

    ViewPagerAdapter viewPagerAdaptater;
    private ActivityClassBinding binding;

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

//this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        tabLayout = findViewById(R.id.tabLayout);
        viewPager2 = findViewById(R.id.viewPager);
        viewPagerAdaptater = new ViewPagerAdapter(this);
        viewPager2.setAdapter(viewPagerAdaptater);

        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager2.setCurrentItem(tab.getPosition());

            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });
        viewPager2.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() {
            @Override
            public void onPageSelected(int position) {
                super.onPageSelected(position);
                tabLayout.getTabAt(position).select();
            }
        });
    }

}

Tab1.java

package fr.xx.xxx.Fragments;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;

import androidx.fragment.app.Fragment;

import fr.xx.xxx.R;
import fr.xx.xxx.databinding.ActivityTab1Binding;
import fr.xx.xxx.utilities.Constants;
import fr.xx.xxx.utilities.PreferenceManager;

public class Tab1 extends Fragment {

    private PreferenceManager preferenceManager;
    private ActivityTab1Binding binding;
    private Button buttonSearch;
    EditText edt1, edt2, edt3, edt4;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        binding = ActivityTab1Binding.inflate(inflater, container, false);
        View view = binding.getRoot();
        buttonSearch = binding.buttonSearch;

        setListeners();
        return view;
    }

    private void setListeners() {

        buttonSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                
            }
        });
    }
    @Override
    public void onDestroyView() {
        super.onDestroyView();
        binding = null;
    }

}

Tab2.java

package fr.xx.xxx.Fragments;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import java.util.ArrayList;
import java.util.List;

import fr.xx.xxx.R;
import fr.xx.xxx.adapters.PretendersAdapter;
import fr.xx.xxx.databinding.ActivityFragmentCompatibiliteBinding;
import fr.xx.xxx.models.Cycle;
import fr.xx.xxx.utilities.Constants;

public class Tab2 extends Fragment {

    // creating variables for our recycler view,
    // array list, adapter, firebase firestore
    // and our progress bar.
    private RecyclerView recyclerView;
    private ArrayList<Cycle> pretendersArrayList;
    private CycleAdapter cycleAdapter;
    private FirebaseFirestore db;
    private ActivityTab2Binding binding;
    ProgressBar loadingPB;
    TextView text1,text2, text3, text4;

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        binding = ActivityTab2Binding.inflate(inflater, container, false);
        View view = binding.getRoot();

        // initializing our variables.
        loadingPB = view.findViewById(R.id.idProgressBar);

        // Inflate the layout for this fragment

        InitTextView(view);

        return view;

    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
 
        // creating our new array list
        cycleArrayList = new ArrayList<>();
        LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
        RecyclerView recyclerView = view.findViewById(R.id.idRVCycle);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);

        // adding our array list to our recycler view adapter class.
        cycleAdapter = new CycleAdapter(getContext(), cycleArrayList);

        // setting adapter to our recycler view.
        recyclerView.setAdapter(cycleAdapter);

    }

   private void InitTextView(View view) {

        text1= binding.idRadioButonSelect;
        text2= binding.idEdit1;
        text3= binding.idEdit2;
        text4= binding.idEdit3;

    }

}

activity_class

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:id="@+id/tab">

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <com.google.android.material.tabs.TabItem
            android:text="Tab1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <com.google.android.material.tabs.TabItem
            android:text="Tab2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <com.google.android.material.tabs.TabItem
            android:text="Tab3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <com.google.android.material.tabs.TabItem
            android:text="Tab4"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    </com.google.android.material.tabs.TabLayout>

    <androidx.viewpager2.widget.ViewPager2

        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

Tab1.xml

<?xml version="1.0" encoding="utf-8"?>

<androidx.constraintlayout.widget.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"
    android:background="@color/White"

    tools:context=".Fragments.Tab1">

    <androidx.constraintlayout.widget.ConstraintLayout

        android:id="@+id/linerLayoutTab1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:backgroundTint="@color/LightBlue"
        android:padding="10dp">

        <RadioGroup
            android:id="@+id/radioGroup"
            android:layout_width="110dp"
            android:layout_height="wrap_content"
            android:layout_margin="25dp"
            android:gravity="center"
            android:inputType="text"
            android:orientation="vertical"
            android:padding="0dp"
            android:textIsSelectable="true"

            app:layout_constraintDimensionRatio="H,1:1"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent">

            <RadioButton
                android:id="@+id/radioButton1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="false"
                android:gravity="center_vertical"
                android:text="RB1"
                android:textColor="@color/Black"
                android:textSize="20dp" />

            <RadioButton
                android:id="@+id/radioButton2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:checked="false"
                android:gravity="center_vertical"
                android:text="RB2"
                android:textColor="@color/Black"
                android:textSize="20dp" />

        </RadioGroup>


        <EditText
            android:id="@+id/edit1"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:hint="00"
            android:textColor="@color/Black"
            android:textAlignment="center">


        </EditText>


        <EditText
            android:id="@+id/edit2"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:hint="00"
            android:textColor="@color/Black"
            android:textAlignment="center">


        </EditText>


        <EditText
            android:id="@+id/edit3"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:hint="00"
            android:textSize="15dp"
            android:textColor="@color/Black"
            android:textAlignment="center">

        </EditText>


        <EditText
            android:id="@+id/edit4"
            android:layout_width="70dp"
            android:layout_height="50dp"
            android:hint="00"
            android:textSize="15dp"
            android:textColor="@color/Black"
            android:textAlignment="center">

        </EditText>


        <Button
            android:id="@+id/buttonSearch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Valider"
            android:textSize="25dp"
            android:layout_margin="25dp"
            android:textColor="@color/White"/>



    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

Tab2.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    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"
    tools:context=".activities.ClassActivity">


    <TextView
        android:id="@+id/idText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="70dp"
        android:text="text4" />

    <TextView
        android:id="@+id/idText2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="120dp"
        android:text="text4" />

    <TextView
        android:id="@+id/idText3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="200dp"
        android:text="text4" />

    <TextView
        android:id="@+id/idText4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="290dp"
        android:text="text4" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/idRVCycle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@id/idtext1"/>

    <!--Progress bar for showing loading screen-->
    <ProgressBar
        android:id="@+id/idProgressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" />

</RelativeLayout>

Si besoin de complément d'informations, demandez moi.

J'espère que quelqu'un pourra me donner une piste de travail.

Merci d'avance.


6 réponses

BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
18 déc. 2023 à 12:08

Hello,

Plusieurs possibilités pour le faire.

1. Tu peux passer des paramètres à tes fragments

public class Tab2 extends Fragment {

  private String param1;
  private int param2;

  public static Tab2 newInstance(String param1, int param2) {
    Bundle bundle = new Bundle();
    bundle.putString("param1", param1);
    bundle.putInt("param2", param2);

    Tab2 fragment = new Tab2();
    fragment.setArguments(bundle);

    return fragment;
  }

  private void readBundle(Bundle bundle) {
    if (bundle != null) {
      param1 = bundle.getString("param1");
      param2 = bundle.getInt("param2");
    }
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_sample, container, false);
    // blabla

    readBundle(getArguments());

    // blabla
    return view;
  }

}

2. Tu peux utiliser un objet "session" qui va contenir les informations que tu veux passées. Ainsi, chaque tab devra le mettre à jour et pourra lire les infos qui le concerne.


0
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024
Modifié le 18 déc. 2023 à 21:41

Bonsoir Bruno

merci pour ton aide.

Avant de faire une bêtise,

1/ Dois-je recopier ton code dans chaque class concernée (Tab1, Tab2, Tab3...)?

2/ "param1" = la clé et param1 = sa valeur ? (c'est un peu le principe de "sharedpreferences"?)

3/ Je ne comprends pas comment les textview de Tab2 se remplissent ?

je dois écrire quelque chose dans les parenthèses de getArguments?

Faut-il initialiser mes textview et les inclurent dans onCreateView?

4/ Peux-tu m'expliquer comment créer un objet "session" ? je ne vois pas du tout à quoi ça peut ressembler.

Je te suis reconnaissant de prendre du temps pour moi.

Désolé si je pose trop de questions.

Merci


0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
19 déc. 2023 à 09:37

1 et 2: oui, c'est ça.

Pour le point 3, tu peux setter les valeurs dans le onCreateView() ou bien dans InitTextViews(). Pas besoin d'ajouter des paramètres à getArguments(), c'est une API système qui permet de récupérer les arguments passés à un Fragment.

Pour le 4, c'est un objet classique que tu vas utiliser tout au long de ton process. A initialiser au début du tunnel et à instantier via un Singleton ou via une classe accessible par tous tes fragments. Typiquement, si c'est une suite de formulaire, ton objet va contenir toutes les infos saisies par l'utilisateur: les valeurs des TextViews, des CheckBox, etc. L'intérêt d'avoir un seul objet comme ça est multiple:

- code propre: la souveraineté des données est liée à ton objet

- pas de passage de paramètres à prévoir


0
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024
19 déc. 2023 à 20:37

bonsoir Bruno,

merci pour tes réponses.

je viens de mettre en place le code mais ça ne fonctionne pas.

voila ce que j'ai fait

Tab1.java

   public static FragmentTab1 newInstance(String param1, int param2, int param3, int param4) {


        Bundle bundle = new Bundle();
        bundle.putString("key1", binding.txt1.getText().toString() );
        bundle.putInt("key2", Integer.parseInt(binding.txt2.getText().toString()));
        bundle.putInt("key3", Integer.parseInt(binding.txt3.getText().toString()));
        bundle.putInt("key4", Integer.parseInt(binding.edt1.getText().toString()));

        FragmentTab1 fragment = new FragmentTab1();
        fragment.setArguments(bundle);

        return fragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        binding = ActivityFragmentTab1Binding.inflate(inflater, container, false);
        View view = binding.getRoot();

        InitGen();

        setListeners();

        return view;
    }


    private void setListeners() {

        buttonSearch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                readBundle(getArguments());

            }
        });
    }

    private void InitGen() {

        buttonSearch = binding.buttonSearch;

        txt1= binding.txt1;
        txt2= binding.txt2;
        txt3= binding.txt3;
        edt1= binding.edt1;

    }

    private void readBundle(Bundle bundle) {
        if (bundle != null) {

            param1 = bundle.getString("key1");
            param2 = bundle.getInt("key2");
            param3 = bundle.getInt("key3");
            param4 = bundle.getInt("key4");

        }
    }

Tab2.java

   public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        binding = ActivityFragmentTab2Binding.inflate(inflater, container, false);
        View view = binding.getRoot();

        // initializing our variables.
        loadingPB = binding.idProgressBar;

        // Inflate the layout for this fragment

        InitTxt(view);
        
        readBundle(getArguments());

        return view;

    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);



    }

   private void InitTxt(View view) {

        key1 = binding.txt1;
        key2 = binding.txt2;
        key3 = binding.txt3;
        key4 = binding.txt4;

    }

    public static FragmentTab2 newInstance(String param1, int param2, int param3, int param4) {

        Bundle bundle = new Bundle();
        bundle.putString("key1", binding.txt1.getText().toString() );
        bundle.putInt("key2", Integer.parseInt(binding.txt2.getText().toString()));
        bundle.putInt("key3", Integer.parseInt(binding.txt3.getText().toString()));
        bundle.putInt("key4", Integer.parseInt(binding.txt4.getText().toString()));

        FragmentTab2fragment = new FragmentTab2();
        fragment.setArguments(bundle);

        return fragment;
    }

    private void readBundle(Bundle bundle) {
        if (bundle != null) {
            param1 = bundle.getString("key1");
            param2 = bundle.getInt("key2");
            param3 = bundle.getInt("key3");
            param4 = bundle.getInt("key4");
        }
    }

Je ne vois pas comment mes textview de Tab2 peuvent s'actualiser avec les données de Tab1?

Dois-je mettre "public static FragmentTab2 newInstance..." dans Tab2 ?

Faut-il que je mette aprés "readBundle(getArguments()); txt1.setText(param1) ?

Ai-je fait des erreurs?

Merci d'avance pour ton retour.


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 3 895
20 déc. 2023 à 15:34

Le code que je t'ai posté permet d'instancier des fragments avec des paramètres. Par contre, tu ne peux pas utiliser le Binding ou tout autre objet "vue" dans newInstance() car ta vue n'est pas créée. Il y faut seulement stocker les paramètres pour pouvoir les utiliser dans le onCreateView().

Pour changer de tabs, je vois que tu passes par un ViewPagerAdapter. C'est ici que tu vas utiliser la création de Fragments avec Paramètres. Il ne te reste plus qu'à passer tes paramètres de tab1 à l'activity parente pour pouvoir les utiliser pour la création de tab2.

Voici un exemple de code: https://guides.codepath.com/android/viewpager-with-fragmentpageradapter


0
CR16_Padawan Messages postés 54 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 24 avril 2024
21 déc. 2023 à 16:40

Bonjour Bruno,

je me suis inspiré de ton lien, toutefois je ne sais pas comment remplacer les paramètres.

ClassActivity.java

    public static class MyPagerAdapter extends FragmentPagerAdapter {
        private static int NUM_ITEMS = 3;

        public MyPagerAdapter(FragmentManager fragmentManager) {
            super(fragmentManager);
        }

        // Returns total number of pages
        @Override
        public int getCount() {
            return NUM_ITEMS;
        }

        // Returns the fragment to display for that page
        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0: // Fragment # 0 - This will show FirstFragment
                    return Tab1.newInstance(0, "A");
                case 1: // Fragment # 0 - This will show FirstFragment different title
                    return Tab1.newInstance(1, "B");
                case 2: // Fragment # 1 - This will show SecondFragment
                    return Tab2.newInstance(2, "C");
                default:
                    return null;
            }
        }

        // Returns the page title for the top indicator
        @Override
        public CharSequence getPageTitle(int position) {
            return "" + position;
        }

    }

Tab1

public class Tab1 extends Fragment {
    // Store instance variables
    private String title;
    private int page;

    // newInstance constructor for creating fragment with arguments
    public static Tab1 newInstance(int page, String title) {
        Tab1 tab1 = new Tab1();
        Bundle args = new Bundle();
        args.putInt("key1", page);
        args.putString("key2", title);
        tab1.setArguments(args);
        return tab1;
    }

    // Store instance variables based on arguments passed
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        page = getArguments().getInt("key1", 0);
        title = getArguments().getString("key2");
    }

    // Inflate the view for the fragment based on layout XML
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_tab1, container, false);
        EditText edtname = (EditText) view.findViewById(R.id.edtName);
        edtname.setText(page + " -- " + title);
        return view;
    }
} // end of activity

J'ai compris le fonctionnement mais je souhaite que le "A" soit remplacé par le contenu du TextView (txt1) de Tab1 puis transmis au Textview (txt1) de Tab2.

je n'arrive pas à faire ce qu'il faut, j'ai tenté de mettre new instance et readBundle dans ma class principale mais je ne comprend pas.

Peux-tu s'il te plait me faire un exemple type que je pourrais modifier en fonction de mes besoins?

Merci par avance.


0