Envoyer des données d'activité pour fragmenter dans Android

317

J'ai deux classes. Le premier est l'activité, le second est un fragment où j'en ai EditText. Dans l'activité, j'ai une sous-classe avec async-task et dans la méthode, doInBackgroundj'obtiens un résultat que j'enregistre dans une variable. Comment envoyer cette variable de la sous-classe "mon activité" à ce fragment?

user1302569
la source

Réponses:

663

À 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) {
    String strtext = getArguments().getString("edttext");    
    return inflater.inflate(R.layout.fragment, container, false);
}
ρяσѕρєя K
la source
15
pouvez-vous passer un objet au fragment?
yeahman
63
Hmm, j'obtiens une NullPointerException lors de l'appelgetArguments().getString(key)
Nima G
9
NullPointerException "String strtext setArguments (). GetString (" edttext ");"
Jorgesys
4
Lors de la lecture du contenu du bundle dans un fragment, recevez d'abord le bundle dans un objet Bundle à l'aide de la méthode getArguments et comparez-le à null. Sinon, la méthode getString sera appliquée sur null et donc sur le NPE quand aucun bundle n'est passé. Cela évitera les exceptions de pointeur nul lorsque le bundle n'est pas transmis.
balachandarkm
3
@Aznix. Il n'est pas recommandé de créer un constructeur pour le fragment.
Azam
108

Vous pouvez également accéder aux données d'activité à partir du fragment:

Activité:

public class MyActivity extends Activity {

    private String myString = "hello";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        ...
    }

    public String getMyData() {
        return myString;
    }
}

Fragment:

public class MyFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        MyActivity activity = (MyActivity) getActivity();
        String myDataFromActivity = activity.getMyData();
        return view;
    }
}
Ricardas
la source
78
Cette solution intègre un couplage étroit entre votre activité et Fragment, mieux utiliser la Bundleclasse pour transmettre des informations. Vous pouvez également faire getMyData()hériter et implémenter cette méthode à partir d'une interface et Fragmentvérifier si getActivity renvoie une instanceofinterface dans onAttach().
Rudi Kershaw
1
Cette solution me convient le mieux. De plus, si myString est public, vous n'avez pas déclaré la méthode getMyData ()
Burak Öztürk
1
La réponse actuellement acceptée renvoie une exception de pointeur nul. Cela devrait être la réponse acceptée
Richmond
9
Cela ne devrait pas être la réponse acceptée. Le couplage serré est facilement évitable. C'est généralement une mauvaise idée, et rend le fragment inutile, pourrait tout aussi bien ne pas en avoir un si vous ne l'utilisez que lié à une activité. Le fragment ne peut pas être réutilisé dans d'autres activités.
Martin Marconcini
51

J'ai trouvé beaucoup de réponses ici @ stackoverflow.com mais c'est certainement la bonne réponse:

Msgstr "Envoi de données d 'activité à fragmenter dans android".

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) {
        Bundle bundle = this.getArguments();
        String myValue = bundle.getString("message");
        ...
        ...
        ...
        }

ou juste

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        String myValue = this.getArguments().getString("message");
        ...
        ...
        ...
        }
Jorgesys
la source
Je suppose que ce n'est pas la meilleure approche pour mettre à jour onQueryTextSubmit-search-results dans un ListView, qui est imbriqué dans un fragment (si somybody tape rapidement, il enverra les arguments deux fois par seconde)?
Martin Pfeffer
1
Qu'en est-il de l'objet insted de chaîne ou int?
Dario
2
@Jorgesys Et cette solution? developer.android.com/training/basics/fragments/…
yozhik
23

Cette réponse est peut-être trop tard. mais il sera utile pour les futurs lecteurs.

J'ai quelques critères. J'ai codé pour choisir le fichier d'intention. et le fichier sélectionné à transmettre à un fragment particulier pour un traitement ultérieur. j'ai de nombreux fragments ayant la fonctionnalité de cueillette de fichiers. à l'époque, à chaque fois vérifier la condition et obtenir le fragment et passer la valeur est assez dégoûtant. donc, j'ai décidé de passer la valeur en utilisant l'interface.

Étape 1: Créez l'interface sur l'activité principale.

   public interface SelectedBundle {
    void onBundleSelect(Bundle bundle);
   }

Étape 2: créer la référence SelectedBundle sur la même activité

   SelectedBundle selectedBundle;

Étape 3: créer la méthode dans la même activité

   public void setOnBundleSelected(SelectedBundle selectedBundle) {
       this.selectedBundle = selectedBundle;
   }

Étape 4: Besoin d'initialiser la référence SelectedBundle qui sont tous des fragments ont besoin de la fonctionnalité de sélection de fichiers.Vous placez ce code sur votre onCreateView(..)méthode de fragment

    ((MainActivity)getActivity()).setOnBundleSelected(new MainActivity.SelectedBundle() {
          @Override
         public void onBundleSelect(Bundle bundle) {
            updateList(bundle);
        }
     });

Étape 5: Mon cas, je dois passer l'image Uri de HomeActivity pour la fragmenter. J'ai donc utilisé cette fonctionnalité sur la méthode onActivityResult.

onActivityResult de MainActivity, transmettez les valeurs aux fragments à l'aide de l'interface.

Remarque: votre cas peut être différent. vous pouvez l'appeler de n'importe où depuis votre HomeActivity.

 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent  data) {
       selectedBundle.onBundleSelect(bundle);
  }

C'est tout. Implémentez chaque fragment dont vous avez besoin sur la FragmentClass. Vous êtes formidable. Vous avez fait. SENSATIONNEL...

Noorul
la source
15

L'idée de base de l'utilisation des fragments (F) est de créer des composants d'interface utilisateur autonomes réutilisables dans les applications Android. Ces fragments sont contenus dans des activités et il existe un (meilleur) moyen commun de créer des voies de communication de A -> F et FA, il est indispensable de communiquer entre FF à travers une activité car alors seuls les fragments deviennent découplés et auto-entretenus.

Ainsi, le passage des données de A -> F sera le même que celui expliqué par ρяσѕρєя K. En plus de cette réponse, après la création des fragments à l'intérieur d'une activité, nous pouvons également transmettre des données aux fragments appelant des méthodes dans Fragments.

Par exemple:

    ArticleFragment articleFrag = (ArticleFragment)
                    getSupportFragmentManager().findFragmentById(R.id.article_fragment);
    articleFrag.updateArticleView(position);
diyoda_
la source
15

L'approche la meilleure et la plus pratique consiste à appeler une instance de fragment et à envoyer des données à ce moment. chaque fragment par défaut a une méthode d'instance

Par exemple: si le nom de votre fragment est MyFragment

vous appellerez donc votre fragment d'une activité comme celle-ci:

getSupportFragmentManager().beginTransaction().add(R.id.container, MyFragment.newInstance("data1","data2"),"MyFragment").commit();

* R.id.container est un identifiant de mon FrameLayout

ainsi dans MyFragment.newInstance ("data1", "data2") vous pouvez envoyer des données à fragmenter et dans votre fragment vous obtenez ces données dans MyFragment newInstance (String param1, String param2)

public static MyFragment newInstance(String param1, String param2) {
        MyFragment fragment = new MyFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

puis dans la méthode de fragment onCreate , vous obtiendrez les données:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

alors maintenant mParam1 a data1 et mParam2 have data2

vous pouvez maintenant utiliser ce mParam1 et mParam2 dans votre fragment.

Pre_hacker
la source
qu'est-ce que R.id.container ici? voulez-vous dire R.id.container_current c'est une valeur int.
shaurya uppal
@s * R.id.container est un identifiant de mon FrameLayout
Pre_hacker
Jusqu'à présent, la meilleure explication que j'ai jamais trouvée pour transmettre des données sur l'ajout / le remplacement de fragments à l'aide de Fragment Manager. Fonctionne comme un bijou! Merci!
sam
utilisé R.id.nav_host_fragment au lieu de R.id.container
Bahaa Hany
10

Je voudrais ajouter pour les débutants que la différence entre les 2 réponses les plus votées ici est donnée par l'utilisation différente d'un fragment.

Si vous utilisez le fragment dans la classe java où vous avez les données que vous souhaitez transmettre, vous pouvez appliquer la première réponse pour transmettre les données:

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

Si toutefois vous utilisez par exemple le code par défaut donné par Android Studio pour les fragments à onglets, ce code ne fonctionnera pas.

Cela ne fonctionnera pas même si vous remplacez le PlaceholderFragment par défaut par vos FragmentClasses, et même si vous corrigez FragmentPagerAdapter à la nouvelle situation en ajoutant un commutateur pour getItem () et un autre commutateur pour getPageTitle () (comme illustré ici )

Attention: le clip mentionné ci-dessus contient des erreurs de code, que j'expliquerai plus loin ici, mais est utile pour voir comment vous passez du code par défaut au code modifiable pour les fragments à onglets)! Le reste de ma réponse est beaucoup plus logique si vous considérez les classes java et les fichiers xml de ce clip (représentatif d'une première utilisation de fragments tabulés par un scénario débutant).

La principale raison pour laquelle la réponse la plus positive de cette page ne fonctionnera pas est que dans ce code par défaut pour les fragments à onglets, les fragments sont utilisés dans une autre classe java: FragmentPagerAdapter!

Donc, pour envoyer les données, vous êtes tenté de créer un bundle dans MotherActivity et de le passer dans FragmentPagerAdapter, en utilisant la réponse n ° 2.

Seulement, c'est encore mal. ( Vous pourriez probablement le faire comme ça, mais ce n'est qu'une complication qui n'est pas vraiment nécessaire ).

La manière correcte / plus facile de le faire, je pense, est de passer les données directement au fragment en question, en utilisant la réponse n ° 2. Oui, il y aura un couplage étroit entre l'activité et le fragment, MAIS, pour les fragments à onglets, ce qui est en quelque sorte attendu. Je vous conseillerais même de créer les fragments tabulés à l'intérieur de la classe java MotherActivity (en tant que sous-classes, car ils ne seront jamais utilisés en dehors de MotherActivity) - c'est facile, ajoutez simplement à l'intérieur de la classe java MotherActivity autant de fragments que vous le souhaitez, comme ceci:

 public static class Tab1 extends Fragment {

    public Tab1() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
        return rootView;
    }
}.

Donc, pour transmettre des données de la MotherActivity à un tel fragment, vous devrez créer des chaînes / bundles privés au-dessus de l'activité onCreate de votre mère - que vous pouvez remplir avec les données que vous souhaitez transmettre aux fragments et les transmettre via un méthode créée après le onCreate (ici appelé getMyData ()).

public class MotherActivity extends Activity {

    private String out;
    private Bundle results;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mother_activity);

       // for example get a value from the previous activity
        Intent intent = getIntent();
        out = intent.getExtras().getString("Key");

    }

    public Bundle getMyData() {
        Bundle hm = new Bundle();
        hm.putString("val1",out);
        return hm;
    }
}

Et puis dans la classe fragment, vous utilisez getMyData:

public static class Tab1 extends Fragment {
        /**
         * The fragment argument representing the section number for this
         * fragment.
         */
        public Tab1() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.your_layout_name_for_fragment_1, container, false);
            TextView output = (TextView)rootView.findViewById(R.id.your_id_for_a_text_view_within_the_layout);

            MotherActivity activity = (MotherActivity)getActivity();

            Bundle results = activity.getMyData();
            String value1 = results.getString("val1");

            output.setText(value1);
            return rootView;
        }
    }

Si vous avez des requêtes de base de données, je vous conseille de les faire dans MotherActivity (et de passer leurs résultats sous forme de chaînes / entiers attachés aux clés dans un bundle comme indiqué ci-dessus), comme dans les fragments tabulés, votre syntaxe deviendra plus complexe (cela devient getActivity () par exemple, et getIntent devient getActivity (). getIntent), mais vous avez également la possibilité de faire ce que vous voulez.

Mon conseil pour les débutants est de se concentrer sur de petites étapes. Tout d'abord, obtenez votre intention d'ouvrir une activité à onglets très simple, sans transmettre de données. Est-ce que ça marche? Ouvre-t-il les onglets que vous attendez? Sinon, pourquoi?

Commencez par cela, et en appliquant des solutions telles que celles présentées dans ce clip , voyez ce qui manque. Pour ce clip particulier, le fichier mainactivity.xml n'est jamais affiché. Cela vous troublera sûrement. Mais si vous faites attention, vous verrez que par exemple le contexte (tools: context) est incorrect dans les fichiers de fragments xml. Chaque fragment XML doit pointer vers la classe de fragment correcte (ou sous-classe à l'aide du séparateur $).

Vous verrez également que dans la classe java d'activité principale, vous devez ajouter tabLayout.setupWithViewPager (mViewPager) - juste après la ligne TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); sans cette ligne, votre vue n'est en fait pas liée aux fichiers XML des fragments, mais elle affiche UNIQUEMENT le fichier xml de l'activité principale.

En plus de la ligne de la classe java d'activité principale, dans le fichier XML d'activité principale, vous devez modifier les onglets en fonction de votre situation (par exemple, ajouter ou supprimer des TabItems). Si vous n'avez pas d'onglets dans le XML d'activité principal, vous n'avez peut-être pas choisi le type d'activité correct lorsque vous l'avez créé en premier lieu (nouvelle activité - activité à onglets).

Veuillez noter que dans les 3 derniers paragraphes je parle de la vidéo! Donc, quand je dis XML d'activité principale, c'est le XML d'activité principale dans la vidéo, qui dans votre situation est le fichier XML MotherActivity.

Adrian Stoica
la source
8

Si vous transmettez une référence au fragment (sous-classe concrète de) dans la tâche asynchrone, vous pouvez alors accéder directement au fragment.

Quelques façons de passer la référence de fragment dans la tâche asynchrone:

  • Si votre tâche asynchrone est une classe à part entière ( class FooTask extends AsyncTask), passez votre fragment au constructeur.
  • Si votre tâche asynchrone est une classe interne, déclarez simplement une variable Fragment finale dans la portée de la tâche asynchrone ou en tant que champ de la classe externe. Vous pourrez y accéder depuis la classe interne.
Martin
la source
Votre réponse me semble tout à fait légitime, pouvez-vous développer un peu plus en fournissant un exemple de code à faire?
Leon Armstrong
6

Parfois, vous pouvez recevoir Intent dans votre activité et vous devez transmettre les informations à votre fragment de travail.
Les réponses données sont correctes si vous devez démarrer le fragment mais s'il fonctionne toujours, ce setArguments()n'est pas très utile.
Un autre problème se produit si les informations transmises provoquent une interaction avec votre interface utilisateur. Dans ce cas, vous ne pouvez pas appeler quelque chose comme, myfragment.passData()car Android vous dira rapidement que seul le thread qui a créé la vue peut interagir.

Donc, ma proposition est d'utiliser un récepteur. De cette façon, vous pouvez envoyer des données de n'importe où, y compris l'activité, mais le travail se fera dans le contexte du fragment.

En vous fragmentez onCreate():

protected DataReceiver dataReceiver;
public static final String REC_DATA = "REC_DATA";

@Override
public void onCreate(Bundle savedInstanceState) {


    data Receiver = new DataReceiver();
    intentFilter = new IntentFilter(REC_DATA);

    getActivity().registerReceiver(dataReceiver, intentFilter);
}

private class DataReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        int data= intent.getIntExtra("data", -1);

        // Do anything including interact with your UI
    }
}

Dans votre activité:

// somewhere
Intent retIntent = new Intent(RE_DATA);
retIntent.putExtra("data", myData);
sendBroadcast(retIntent);
fralbo
la source
5

Très vieux post, j'ose encore ajouter une petite explication qui m'aurait été utile.

Techniquement, vous pouvez définir directement des membres de tout type dans un fragment d'activité.
Alors pourquoi Bundle?
La raison est très simple - Bundle fournit un moyen uniforme de gérer:
- la création / ouverture d'un fragment
- la reconfiguration (rotation de l'écran) - il suffit d'ajouter le bundle initial / mis à jour à outState dans onSaveInstanceState ()
- la restauration de l'application après avoir été récupérée en arrière-plan ( comme pour la reconfiguration).

Vous pouvez (si vous aimez les expériences) créer une solution de contournement dans des situations simples, mais l'approche Bundle ne voit tout simplement pas la différence entre un fragment et mille sur un backstack - elle reste simple et directe.
C'est pourquoi la réponse de @Elenasys est la solution la plus élégante et universelle.
Et c'est pourquoi la réponse donnée par @Martin a des pièges

sberezin
la source
4

la meilleure approche pour envoyer des données de la classe d'activité au fragment passe par des méthodes de définition. Comme

FragmentClass fragmentClass = new FragmentClass();
fragmentClass.setMyList(mylist);
fragmentClass.setMyString(myString);
fragmentClass.setMyMap(myMap);

et obtenir facilement ces données de la classe.

ssi-anik
la source
Comment passer des données d'un fragment à un autre comme stackoverflow.com/questions/32953477/pass-data-to-fragment
Hoo
Ce n'est pas très pratique lorsque vous passez également le long d'autres, précédemment définis
Gerard
Si vous avez besoin que ces données soient définies dans un champ de votre fragment et qu'elles ne soient pas encore visibles (initialisées), vous obtiendrez NPE.
yozhik
J'ai cessé de travailler avec Android il y a probablement 3 ans, ces choses peuvent être dépréciées ces jours-ci.
ssi-anik
4

De Activityvous envoyez des données avec Bundle en tant que:

Bundle bundle = new Bundle();
bundle.putString("data", "Data you want to send");

// Your fragment
MyFragment obj = new MyFragment();
obj.setArguments(bundle);

Et dans la Fragmentméthode onCreateView, obtenez les données:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    String data = getArguments().getString("data");// data which sent from activity  
    return inflater.inflate(R.layout.myfragment, container, false);
}
Vijay
la source
3

Si an activitydoit fragmenteffectuer une action après l'initialisation, la méthode la plus simple consiste à activityinvoquer une méthode sur l' fragmentinstance. Dans le fragment, ajoutez une méthode:

public class DemoFragment extends Fragment {
  public void doSomething(String param) {
      // do something in fragment
  }
}

puis dans le activity, accédez à l' fragmentaide du fragmentgestionnaire et appelez le method:

public class MainActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        DemoFragment fragmentDemo = (DemoFragment) 
            getSupportFragmentManager().findFragmentById(R.id.fragmentDemo);
        fragmentDemo.doSomething("some param");
    }
}

puis le activitypeut communiquer directement avec le fragmenten l'invoquant method.


la source
1
c'est vraiment bien, dans le sens où vous ne voulez pas entrer dans la onCreateViewméthode dans le fragment. était vraiment utile
Jeune Emil
2

Utilisez l'interface suivante pour communiquer entre l'activité et le fragment

public interface BundleListener {
    void update(Bundle bundle);
    Bundle getBundle();
}

Ou utilisez le suivi de cet écouteur générique pour une communication bidirectionnelle à l'aide de l'interface

 /**
 * Created by Qamar4P on 10/11/2017.
 */
public interface GenericConnector<T,E> {
    T getData();
    void updateData(E data);
    void connect(GenericConnector<T,E> connector);
}

fragment show method

public static void show(AppCompatActivity activity) {
        CustomValueDialogFragment dialog = new CustomValueDialogFragment();
        dialog.connector = (GenericConnector) activity;
        dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
    }

vous pouvez lancer votre contexte GenericConnectordans onAttach(Context)trop

dans votre activité

CustomValueDialogFragment.show(this);

dans ton fragment

...
@Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        connector.connect(new GenericConnector() {
            @Override
            public Object getData() {
                return null;
            }

            @Override
            public void updateData(Object data) {

            }

            @Override
            public void connect(GenericConnector connector) {

            }
        });
    }
...
    public static void show(AppCompatActivity activity, GenericConnector connector) {
            CustomValueDialogFragment dialog = new CustomValueDialogFragment();
            dialog.connector = connector;
            dialog.show(activity.getSupportFragmentManager(),"CustomValueDialogFragment");
        }

Remarque: ne l'utilisez jamais comme un "".toString().toString().toString();moyen.

Qamar
la source
2

vient de tomber sur cette question, alors que la plupart des méthodes ci-dessus fonctionneront. Je veux juste ajouter que vous pouvez utiliser la bibliothèque de bus d'événements , en particulier dans les scénarios où le composant (activité ou fragment) n'a pas été créé, il convient à toutes les tailles de projets Android et à de nombreux cas d'utilisation. Je l'ai personnellement utilisé dans plusieurs projets que j'ai sur Playstore.

Joshua Majebi
la source
1

Vous pouvez créer une méthode statique publique dans un fragment où vous obtiendrez une référence statique de ce fragment, puis transmettre des données à cette fonction et définir ces données sur argument dans la même méthode et obtenir des données via getArgument sur la méthode oncreate de fragment, et définir ces données sur local variables.

M.Noman
la source
1

La façon la plus intelligente et la plus éprouvée de transmettre des données entre les fragments et l'activité consiste à créer des variables, par exemple:

class StorageUtil {
  public static ArrayList<Employee> employees;
}

Ensuite, pour passer des données d'un fragment à une activité, nous le faisons dans la méthode onActivityCreated:

//a field created in the sending fragment
ArrayList<Employee> employees;

@Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
         employees=new ArrayList();

       //java 7 and above syntax for arraylist else use employees=new ArrayList<Employee>() for java 6 and below

     //Adding first employee
        Employee employee=new Employee("1","Andrew","Sam","1984-04-10","Male","Ghanaian");
        employees.add(employee);

      //Adding second employee
       Employee employee=new Employee("1","Akuah","Morrison","1984-02-04","Female","Ghanaian");
         employees.add(employee);

        StorageUtil.employees=employees;
    }

Maintenant, vous pouvez obtenir la valeur de StorageUtil.employees de partout. Bonne chance!

Andrew Sam
la source
0

Ma solution est d'écrire une méthode statique à l'intérieur du fragment:

public TheFragment setData(TheData data) {
    TheFragment tf = new TheFragment();
    tf.data = data;
    return tf;
}

De cette façon, je suis sûr que toutes les données dont j'ai besoin se trouvent à l'intérieur du fragment avant toute autre opération possible qui pourrait avoir besoin de fonctionner avec. De plus, il a l'air plus propre à mon avis.

Matteo
la source
1
Eh bien, si TheData n'est pas sûr pour les threads, le rendre statique ne vous protégera pas nécessairement des problèmes de threads. Attention à ça. La statique n'est pas sécurisée par nature.
Martin Marconcini
0

J'ai rencontré un problème similaire lors de l'utilisation du dernier composant d'architecture de navigation. J'ai essayé tout le code mentionné ci-dessus en passant un paquet de mon activité d'appel à Fragment.

La meilleure solution, en suivant les dernières tendances de développement d'Android, est d'utiliser View Model (qui fait partie d'Android Jetpack).

Créez et initialisez une classe ViewModel dans l'activité parent. Veuillez noter que ce ViewModel doit être partagé entre l'activité et le fragment.

Maintenant, à l'intérieur de onViewCreated () du fragment, initialisez le même ViewModel et configurez les observateurs pour écouter les champs ViewModel.

Voici un tutoriel utile et approfondi si vous en avez besoin.

https://medium.com/mindorks/how-to-communicate-between-fragments-and-activity-using-viewmodel-ca733233a51c

devDeejay
la source
-4

Dans votre activité, déclarez une variable statique

public static HashMap<String,ContactsModal> contactItems=new HashMap<String, ContactsModal>();

Ensuite, dans votre fragment, aimez suivre

ActivityName.contactItems.put(Number,contactsModal);
Dv Keerthi
la source
Cela fonctionnera mais NON RECOMMANDÉ. Les membres statiques resteront en mémoire à moins que l'application ne soit forcée de fermer les applications récentes. Donc, dans un cas comme celui-ci, vous ne devez utiliser un membre statique que lorsque vous en avez besoin dans de nombreuses activités de l'application.
M Shaban Ali