Passer un paramètre à un fragment [Résolu]

Signaler
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020
-
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020
-
Bonjour,
Je créé actuellement ma première application android, et je suis dans situation suivante : il faudrait que je passe à mon fragment un objet "Carte" (que j'ai crée). J'ai bien vu des tuto et des vidéo, mais je n'ai pas du tout comprit comment faire alors es ce que quelqu'un pourrait m'expliquer ou bien m'aiguiller vers un bon tuto s'il vous plaît ?

Merci d'avance pour vos réponse.
Cordialement.

5 réponses

Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020
1 828
Bonjour,

Il faut passer par les bundle et les arguments. As-tu vraiment besoin de l'objet en entier ou bien juste quelques champs ?
Tu es en Java ou en Kotlin ?
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020

Je suis en java et non j'ai pas besoin de tout les champs
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020
1 828
Dans ton Fragment, je te conseille de mettre une fonction statique comme ceci :

    // Définition des clés pour retrouver les valeurs dans le bundle
    public static final String EXTRA_PARAM_1 = "extra_param_1";
    public static final String EXTRA_PARAM_2 = "extra_param_2";

    public static MonFragment newInstance(String param1, int param2) {
        Bundle args = new Bundle();
        args.putString(EXTRA_PARAM_1, param1);
        args.putInt(EXTRA_PARAM_2, param2);

        MonFragment fragment = new MonFragment();
        fragment.setArguments(args);
        return fragment;
    }


Pour créer ton fragment, tu fais comme ceci par exemple :
MonFragment fragment = MonFragment.newInstance("coucou", 42);


Ensuite, pour récupérer les valeurs dans ton fragment
String param1 = getActivity().getIntent().getExtras().getString(EXTRA_PARAM_1);

Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020

Pour récupérer les valeur on met bien le bout de code dans le onCreateView() du fragment ? Car quand je teste dans newInstance() j'ai bien les valeur, mais je peux pas les récupérer ensuite (elles sont nuls )...
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020
1 828
oui, dans le
onCreateView()
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020
>
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020

Bin je ne comprend pas alors pourquoi je reçois une valeur null alors ... Cela pourrais venir d'ou ?
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020
1 828 >
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020

Fais voir ton code : du fragment et de la création du fragment
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020

D'accord :
Voici le code du fragment :

public class FragmentCarte extends Fragment {
    private TextView textViewTexteCarte;
    private ImageView imageCarte;
    private AdapterView.OnItemSelectedListener listener;
    public static final String EXTRA_PARAM_1 = "extra_param_1";
    public static final String EXTRA_PARAM_2 = "extra_param_2";

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment, container, false);
        textViewTexteCarte = (TextView) v.findViewById(R.id.textViewTexteCarte);
        imageCarte = (ImageView) v.findViewById(R.id.imageCarte);
        String param1 = getActivity().getIntent().getExtras().getString(EXTRA_PARAM_1);
        Log.d("tag", "Eelement Fragement" + param1 +" ");
        textViewTexteCarte.setText(param1);
        return v;
    }

    public static FragmentCarte newInstance(String param1, String param2) {
        Bundle args = new Bundle();
        args.putString(EXTRA_PARAM_1, param1);
        args.putString(EXTRA_PARAM_2, param2);

        FragmentCarte fragment = new FragmentCarte();
        fragment.setArguments(args);

        return fragment;
    }
}


et pour la créetion du frangment :
    ListeCarte listeCarte = new ListeCarte();
    protected void onCreate(Bundle savedInstanceState) {

        FragmentCarte fragment = FragmentCarte.newInstance(listeCarte.listeCarte.get(1).getDilemme(), listeCarte.listeCarte.get(1).getImg());

        viewPager = (ViewPager) findViewById(R.id.idpager);
        adapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);

}
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020
>
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020

Bin pour être sur j'ai passer directement les mêmes paramètres que vous mais j'ai la même erreur
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020
1 828 >
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020

Quelle erreur as-tu ?
As-tu testé en debug pas-à-pas ?

Quand je vois ça :
ListeCarte listeCarte = new ListeCarte();
    protected void onCreate(Bundle savedInstanceState) {

        FragmentCarte fragment = FragmentCarte.newInstance(listeCarte.listeCarte.get(1).getDilemme(), listeCarte.listeCarte.get(1).getImg());
...

Je me dis que ton objet
listeCarte
est vide...sauf si tu crées toute la structure de la liste dans le constructeur
ListeCarte()
.
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020
>
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020

Oui c'est ce que je vais, je vois de tester exactement votre code mais j'ai la même erreur ... Voici comment je l'ai intégré :



public class GameActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_game);

        FragmentCarte fragment = FragmentCarte.newInstance("coucou", 42);

        viewPager = (ViewPager) findViewById(R.id.idpager);
        adapter = new ScreenSlidePagerAdapter(getSupportFragmentManager());
        viewPager.setAdapter(adapter);


    }
}







public class FragmentCarte extends Fragment {
    private TextView textViewTexteCarte;
    private ImageView imageCarte;
    private AdapterView.OnItemSelectedListener listener;
    public static final String EXTRA_PARAM_1 = "extra_param_1";
    public static final String EXTRA_PARAM_2 = "extra_param_2";

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment, container, false);
        textViewTexteCarte = (TextView) v.findViewById(R.id.textViewTexteCarte);
        imageCarte = (ImageView) v.findViewById(R.id.imageCarte);
        String param1 = getArguments().getString(EXTRA_PARAM_1);
      //  Log.d("tag", "Eelement Fragement" + param1 +" ");
       // textViewTexteCarte.setText(param1);
        return v;
    }

    public static FragmentCarte newInstance(String param1, int param2) {
        Bundle args = new Bundle();
        args.putString(EXTRA_PARAM_1, param1);
        args.putInt(EXTRA_PARAM_2, param2);

        FragmentCarte fragment = new FragmentCarte();
        Log.d("tag", "Eelement Fragement" + args +" ");

        fragment.setArguments(args);

        return fragment;
    }

}




        <androidx.viewpager.widget.ViewPager
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/idpager"
            android:layout_width="wrap_content"
            android:layout_height="240dp" >
            <fragment
                android:name="com.example.projet.FragmentCarte"
                android:id="@+id/fragmentCarte"
                android:layout_weight="1"
                android:layout_width="1000px"
                android:layout_height="wrap_content"
                android:layout_gravity="center"/>
        </androidx.viewpager.widget.ViewPager>

Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020
1 828 >
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020

Le fragment que tu déclares dans le xml est différent de celui de ton code...Logique donc que tu ne vois pas tes valeurs ;)
Tu déclares un fragment avec des paramètres mais tu n'en fais rien... Tu dois supprimer la déclaration xml et ajouter ton fragment dynamiquement
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020
>
Messages postés
14859
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
9 avril 2020

Encore merci pour votre aide BunoCS !!! =)
Messages postés
137
Date d'inscription
mercredi 2 janvier 2019
Statut
Membre
Dernière intervention
25 mars 2020

D'accord merci
Si d'autre tombe sur le poste et ce demmande comment creer le fragment le code est en dessous sinon aller sur ce lien : https://mathias-seguy.developpez.com/tutoriels/android/comprendre-fragments/#LVI-A
        <LinearLayout
            android:id="@+id/firstpane"
            android:layout_height="fill_parent"
            android:layout_width="wrap_content"
            android:layout_weight="1"
            android:orientation="horizontal">
        </LinearLayout>


        FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        FragmentCarte fragment = FragmentCarte.newInstance("coucou", 42);

        ft.replace(R.id.frag, fragment); //.replace ou .add

        ft.commit();