152 votes

Comment passer une variable d'une activité à un fragment, et la renvoyer ?

Je suis en train de réaliser une application Android, et je veux passer une date entre l'activité et le fragment. Mon activité a un bouton, qui ouvre le fragment : DatePickerFragment.

Dans mon activité je montre une date, que je veux modifier avec le fragment. Je veux donc passer la date au datepicker, et la renvoyer à l'activité.

J'ai essayé beaucoup de solutions, mais aucune ne fonctionne. Le moyen le plus simple serait de passer un argument, mais cela ne peut pas être fait avec des fragments.

232voto

jpardogo Points 1425

Pour passer des informations à un fragment vous définissez Arguments lorsque vous le créez, et vous pouvez récupérer cet argument plus tard dans la méthode onCreate ou onCreateView de votre fragment.

Dans la fonction newInstance de votre fragment, vous ajoutez les arguments que vous voulez lui envoyer :

/**
 * Create a new instance of DetailsFragment, initialized to
 * show the text at 'index'.
 */
public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();
    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);
    return f;
}

Ensuite, à l'intérieur du fragment sur la méthode onCreate o onCreateView vous pouvez récupérer les arguments comme ceci :

Bundle args = getArguments();
int index = args.getInt("index", 0);

Si vous voulez maintenant communiquer de votre fragment avec votre activité (en envoyant ou non des données) vous devez utiliser des interfaces. La façon dont vous pouvez le faire est très bien expliquée dans le tutoriel de la documentation sur la communication entre fragments. Comme tous les fragments communiquent entre eux par l'intermédiaire de l'activité, vous pouvez voir dans ce tutoriel comment vous pouvez envoyer des données du fragment actuel à son conteneur d'activité pour utiliser ces données sur l'activité ou les envoyer à un autre fragment que votre activité contient.

Tutoriel de documentation :

http://developer.Android.com/training/basics/fragments/communicating.html

96voto

Elenasys Points 23268

Envoi de données à partir de Activity à un Fragment

Activité :

Bundle bundle = new Bundle();
String myMessage = "Stackoverflow is cool!";
bundle.putString("message", myMessage );
FragmentClass fragInfo = new FragmentClass();
fragInfo.setArguments(bundle);
transaction.replace(R.id.fragment_single, fragInfo);
transaction.commit();

Fragment :

Lecture de la valeur dans le fragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    String myValue = this.getArguments().getString("message");
    ...
    ...
    ...
}

Mais si vous voulez envoyer des valeurs de Fragment à Activity, lisez la réponse de jpardogo, vous devez avoir des interfaces, plus d'infos : Communiquer avec d'autres fragments

12voto

mahmoud zaher Points 261

Merci à @ K et Terry ... cela m'aide beaucoup et fonctionne parfaitement

Depuis l'activité, vous envoyez des données avec l'intention de :

Bundle bundle = new Bundle(); 
bundle.putString("edttext", "From Activity"); 
// set Fragmentclass Arguments
Fragmentclass fragobj = new Fragmentclass();
fragobj.setArguments(bundle);

et dans la méthode Fragment onCreateView :

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // get arguments
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}

référence : Envoyer des données d'une activité à un fragment dans Android

10voto

Spipau Points 412

Pour tous les développeurs Kotlin :

Voici la solution proposée par Android Studio pour envoyer des données à votre Fragment (= lorsque vous créez un fragment vierge avec File -> New -> Fragment -> Fragment(Blank) et que vous cochez "include fragment factory methods").

Mettez ça dans votre Fragment :

class MyFragment: Fragment {

...

    companion object {

            @JvmStatic
            fun newInstance(isMyBoolean: Boolean) = MyFragment().apply {
                arguments = Bundle().apply {
                    putBoolean("REPLACE WITH A STRING CONSTANT", isMyBoolean)
                }
            }
     }
}

.apply est une astuce intéressante pour définir les données lors de la création d'un objet, ou lorsque l'option ils déclarent ici :

Appelle la fonction [bloc] spécifiée avec this comme son récepteur et renvoie this valeur.

Ensuite, dans votre Activité ou Fragment, faites :

val fragment = MyFragment.newInstance(false)
... // transaction stuff happening here

et lisez les arguments de votre fragment tels que :

private var isMyBoolean = false

override fun onAttach(context: Context?) {
    super.onAttach(context)
    arguments?.getBoolean("REPLACE WITH A STRING CONSTANT")?.let {
        isMyBoolean = it
    }
}

Pour "renvoyer" les données à votre activité Pour cela, il suffit de définir une fonction dans votre activité et d'effectuer les opérations suivantes dans votre fragment :

(activity as? YourActivityClass)?.callYourFunctionLikeThis(date) // your function will not be called if your Activity is null or is a different Class

Profitez de la magie de Kotlin !

5voto

SemaphoreMetaphor Points 691

Utilisez la bibliothèque EventBus pour transmettre un événement qui pourrait contenir votre variable dans les deux sens. Il s'agit d'une bonne solution car elle permet de garder vos activités et vos fragments faiblement couplés.

https://github.com/greenrobot/EventBus

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X