Actualiser contenu fragment par rapport à un autre fragment
RésoluCR16_Padawan Messages postés 61 Date d'inscription mercredi 7 juin 2023 Statut Membre Dernière intervention 22 septembre 2024 - 21 déc. 2023 à 16:40
- Actualiser contenu fragment par rapport à un autre fragment
- Le fichier à télécharger correspond au contenu brut d’un courrier électronique. de quel pays a été envoyé ce message ? - Guide
- Word a trouvé du contenu illisible - Guide
- Mise en forme conditionnelle excel par rapport à une autre cellule - Guide
- Plan d'un rapport de stage - Guide
- On vous a donné accès à un fichier rapport. il est partagé avec plusieurs personnes sur cet espace pix cloud. répondez aux questions - Forum Cloud
6 réponses
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.
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
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
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.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question20 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
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.