web-dev-qa-db-fra.com

Comment passer d'une variable d'activité à fragment et la rendre?

Je suis actuellement en train de créer une application Android et je souhaite passer une date entre activité et fragment . Mon activité comporte un bouton qui ouvre le fragment DatePickerFragment.

Dans mon activité, je montre une date que je veux modifier avec le fragment. Je souhaite donc transmettre la date au sélecteur de date et la renvoyer à l'activité.

J'ai essayé beaucoup de solutions, mais aucune ne fonctionne. La solution de facilité passerait un argument, mais cela ne peut pas être fait avec des fragments.

114
user1687114

Pour transmettre des informations à un fragment, vous définissezArguments lorsque vous le créez et vous pouvez récupérer cet argument ultérieurement sur la méthode onCreate ou onCreateView de votre fragment.

Sur la fonction newInstance de votre fragment, 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 de la méthode onCreate ou onCreateView, vous pouvez récupérer les arguments comme ceci:

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

Si vous voulez maintenant communiquer à partir de votre fragment avec votre activité (envoi ou non de 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 documentation sur la communication entre fragments. Étant donné que tous les fragments communiquent entre eux au cours de l'activité, ce didacticiel explique comment vous pouvez envoyer des données du fragment réel à 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

192
jpardogo

Envoi de données de Activity à 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 en 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 avez besoin d'interfaces, d'informations complémentaires: Communication avec d'autres Fragments

82
Elenasys

Utilisez la bibliothèque EventBus pour transmettre les événements susceptibles de contenir votre variable. C'est une bonne solution, car vos activités et vos fragments sont conservés sans contrainte

https://github.com/greenrobot/EventBus

7
SemaphoreMetaphor

grâce à @ ρяσѕρєя K et Terry ... ça m'aide beaucoup et fonctionne parfaitement 

À partir de 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);
}

reference: Envoyer des données d'activité en fragment dans Android

4
mahmoud zaher

Envoi de données d'activité dans des fragments liés par XML

Si vous créez un fragment dans Android Studio à l'aide de l'un des modèles, par exemple. Fichier> Nouveau> Fragment> Fragment (Liste), le fragment est ensuite lié via XML. La méthode newInstance est créée dans le fragment mais n'est jamais appelée. Elle ne peut donc pas être utilisée pour passer des arguments.

Dans l'activité, remplacez la méthode onAttachFragment.

@Override
public void onAttachFragment(Fragment fragment) {
    if (fragment instanceof DetailsFragment) {
        Bundle args = new Bundle();
        args.putInt("index", index);
        f.setArguments(args);        
     }
}

Ensuite, lisez les arguments de la méthode fragment onCreate comme indiqué dans les autres réponses.

1
Dale

Vous pouvez simplement instancier votre fragment avec un paquet:

Fragment fragment = Fragment.instantiate(this, RolesTeamsListFragment.class.getName(), bundle);
0
stef