198 votes

Passage de données entre un fragment et son activité de conteneur

Comment puis-je faire passer des données entre un fragment et son activité conteneur ? Y a-t-il quelque chose de similaire au passage de données entre les activités par le biais des intents ?

J'ai lu ça, mais ça ne m'a pas beaucoup aidé :
http://developer.Android.com/guide/topics/fundamentals/fragments.html#CommunicatingWithActivity

0 votes

Est-ce insuffisant ? Vous pouvez envoyer tout ce que vous voulez, peut-être pouvez-vous expliquer davantage, que voulez-vous accomplir ?

0 votes

Dans le document, je n'ai pas compris comment, par exemple, je pouvais passer une valeur ou une chaîne de caractères de l'activité au fragment ou vice-versa. Merci

2 votes

La meilleure façon de gérer les appels asynchrones des fragments et de leur renvoyer des données est d'implémenter des BroadcastReceivers des deux côtés. Vous devriez de toute façon le rendre asynchrone si vous travaillez avec un nombre non spécifique de fragments.

338voto

Harlo Holmes Points 1763

Essayez d'utiliser des interfaces.

Tout fragment qui doit renvoyer des données à l'activité qui le contient doit déclarer une interface pour gérer et transmettre les données. Ensuite, assurez-vous que l'activité qui le contient implémente ces interfaces. Par exemple :

JAVA

Dans votre fragment, déclarez l'interface...

public interface OnDataPass {
    public void onDataPass(String data);
}

Ensuite, connectez l'implémentation de l'interface de la classe conteneur au fragment dans la méthode onAttach, comme suit :

OnDataPass dataPasser;

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    dataPasser = (OnDataPass) context;
}

Dans votre fragment, lorsque vous avez besoin de gérer le passage des données, il suffit de l'appeler sur l'objet dataPasser :

public void passData(String data) {
    dataPasser.onDataPass(data);
}

Enfin, dans votre activité de contention qui met en œuvre OnDataPass ...

@Override
public void onDataPass(String data) {
    Log.d("LOG","hello " + data);
}

KOTLIN

Étape 1. Créez l'interface

interface OnDataPass {
    fun onDataPass(data: String)
}

Étape 2. Ensuite, connectez l'implémentation de l'interface de la classe conteneur au fragment dans la méthode onAttach (YourFragment), comme suit :

lateinit var dataPasser: OnDataPass

override fun onAttach(context: Context) {
    super.onAttach(context)
    dataPasser = context as OnDataPass
}

Étape 3. Dans votre fragment, lorsque vous avez besoin de gérer le passage des données, il suffit de l'appeler sur l'objet dataPasser :

fun passData(data: String){
    dataPasser.onDataPass(data)
}

Étape 4. Enfin, dans votre activité implémentant OnDataPass

class MyActivity : AppCompatActivity(), OnDataPass {}

override fun onDataPass(data: String) {
    Log.d("LOG","hello " + data)
}

3 votes

Merci, bonne réponse, qui va droit au but. Ceci est également très bien expliqué aquí . Ce que je n'avais pas réalisé, c'est que l'on peut implémenter plusieurs interfaces. ActionBar.TabListener et a dû ajouter une interface supplémentaire.

6 votes

C'est définitivement la voie à suivre et, à mon avis, la SEULE voie à suivre. Elle permet une interaction bidirectionnelle entre l'activité et le fragment. Elle permet également de communiquer entre les fragments lorsque vous avez plusieurs fragments dans une activité, que ce soit par le biais d'onglets ou d'une disposition multi-fragments.

0 votes

Je crée un BaseFragmetn comme abstrait et ajoute une méthode abstraite onDataPassed() et tous mes fragments étendent ce BaseFragment. Lorsque le passage des données est nécessaire, il suffit de trouver le fragment et appeler onDataPassed est OK. Peut aider.

225voto

Nick Points 2695

Dans votre fragment, vous pouvez appeler getActivity() .

Cela vous donnera accès à l'activité qui a créé le fragment. De là, vous pouvez évidemment appeler toutes les méthodes d'accès qui se trouvent dans l'activité.

par exemple, pour une méthode appelée getResult() sur votre activité :

((MyActivity) getActivity()).getResult();

0 votes

Si j'ai une méthode dans l'activité appelée getResult(), dois-je l'appeler en écrivant getActivity().getResult() ? Cela ne fonctionne pas. Merci

86 votes

Étant donné que vous accédez à une fonction au sein de VOTRE activité (et non de l'activité Android mère), vous devez intégrer votre appel getActivity() : ((MyActivity) getActivity()).getResult() ;

4 votes

Comment sera éventuellement la méthode de retour, du fragment à l'activité ?

23voto

Jeetu Points 341
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    Bundle b = getActivity().getIntent().getExtras();
            wid = b.getString("wid");
            rid = b.getString("rid");
            View view = inflater.inflate(R.layout.categoryfragment, container, false);
    return view;
 }

14 votes

C'est la façon de l'obtenir dans le fragment, mais comment le définir dans la classe qui appelle le fragment si vous avez votre fragment dans le fichier de mise en page xml.

17voto

Elenasys Points 23268

Passage de données entre un fragment et son activité de conteneur

Activité :

        Bundle bundle = new Bundle();
        bundle.putString("message", "Alo Elena!");
        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");
        ...
        ...
        ...
        }

0 votes

Bonjour @Elenasys. Comment puis-je renvoyer des données groupées au fragment depuis l'activité ? Je suis passé du fragment à l'activité et j'ai besoin de revenir au fragment qui est déjà créé (appelle seulement onStart, onResume,...) et j'ai besoin des données que j'ai pu obtenir dans l'activité. Y a-t-il un moyen de le faire ou est-ce que je fais quelque chose de mal ?

-12voto

SuperZouzou Points 1

Une autre façon simple d'obtenir des données, transmises par une autre activité, dans un fragment d'une activité conteneur : par exemple :

Activité_A => Activité_B(Fragment)

Dans votre Activité_A vous créez une intention comme si vous envoyiez une donnée (String ici) à une autre activité :

Intent intent = new Intent(getBaseContext(),Activity_B.class);
intent.putExtra("NAME", "Value");
startActivity(intent);

dans votre Fragment, contenu dans votre Activité_B :

String data = getActivity().getIntent().getExtras();

0 votes

getBaseContext() me donne l'erreur suivante : The method getBaseContext() is undefined for the type new View.OnClickListener(){}

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