Passer un object d’une activité à un fragment

J’ai une Activity qui utilise un Fragment . Je veux simplement passer un object de cette Activity au Fragment .

Comment pourrais-je le faire? Tous les tutoriels que j’ai vus jusqu’ici pour récupérer des données à partir de ressources.

MODIFIER :

Soyons un peu plus précis:

Mon activité a un ListView sur la partie gauche. Lorsque vous cliquez dessus, l’idée est de charger un Fragment sur la partie droite.

Lorsque j’entre dans cette Activity , une Category object est donnée par l’ Intent . Cet object contient une liste de Questions autres objects (qui contient une liste de chaînes). Ces objects Questions sont affichés dans ListView. Lorsque je clique sur un élément du ListView , je souhaite afficher la liste des Ssortingng dans le Fragment (dans un ListView ).

Pour ce faire, j’appelle setContentView() de mon Activity avec une mise en page. Dans cette présentation est défini le Fragment avec la classe correcte à appeler. Lorsque j’appelle ce setContentView() , onCreateView() de mon Fragment est appelé mais à ce moment, getArguments() renvoie null.

Comment pourrais-je le faire remplir avant l’appel de onCreateView() ? (dites-moi si je ne suis pas assez clair)

Merci

Créez une méthode statique dans le Fragment et obtenez-la en utilisant getArguments() .

Exemple:

 public class CommentsFragment extends Fragment { private static final Ssortingng DESCRIBABLE_KEY = "describable_key"; private Describable mDescribable; public static CommentsFragment newInstance(Describable describable) { CommentsFragment fragment = new CommentsFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(DESCRIBABLE_KEY, describable); fragment.setArguments(bundle); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mDescribable = (Describable) getArguments().getSerializable( DESCRIBABLE_KEY); // The rest of your code } 

Vous pouvez ensuite l’appeler depuis l’ Activity faisant quelque chose comme:

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment fragment = CommentsFragment.newInstance(mDescribable); ft.replace(R.id.comments_fragment, fragment); ft.commit(); 

Vous devez créer une méthode dans votre fragment qui accepte le type d’object que vous souhaitez y passer. Dans ce cas, je l’ai nommé “setObject” (creative huh? :)) Cette méthode peut alors effectuer n’importe quelle action avec cet object.

 MyFragment fragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { fragment = new MyFragment(); getSupportFragmentManager().beginTransaction().add(android.R.id.content, detailsFragment) .commit(); } else { fragment = (MyFragment) getSupportFragmentManager().findFragmentById( android.R.id.content); } fragment.setObject(yourObject); //create a method like this in your class "MyFragment" } 

Notez que j’utilise la bibliothèque de support et que les appels à getSupportFragmentManager () peuvent être juste getFragmentManager () selon ce que vous utilisez.

Dans votre classe d’activité:

 public class BasicActivity extends Activity { private ComplexObject co; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_page); co=new ComplexObject(); getIntent().putExtra("complexObject", co); FragmentManager fragmentManager = getFragmentManager(); Fragment1 f1 = new Fragment1(); fragmentManager.beginTransaction() .replace(R.id.frameLayout, f1).commit(); } 

Note: Votre object doit implémenter une interface Serializable

Puis dans votre fragment:

 public class Fragment1 extends Fragment { ComplexObject co; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Intent i = getActivity().getIntent(); co = (ComplexObject) i.getSerializableExtra("complexObject"); View view = inflater.inflate(R.layout.test_page, container, false); TextView textView = (TextView) view.findViewById(R.id.DENEME); textView.setText(co.getName()); return view; } } 

Passer des arguments par groupe est limité à certains types de données. Mais vous pouvez transférer toutes les données sur votre fragment de la manière suivante:

Dans votre fragment, créez une méthode publique comme celle-ci

 public void passData(Context context, List list, int pos) { mContext = context; mLexItemList = list; mIndex = pos; } 

et dans votre activité, appelez passData () avec tous vos types de données nécessaires après l’instanciation du fragment

  WebViewFragment myFragment = new WebViewFragment(); myFragment.passData(getApplicationContext(), mLexItemList, index); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.my_fragment_container, myFragment); ft.addToBackStack(null); ft.commit(); 

Remarque: Mon fragment étend “android.support.v4.app.Fragment”, donc je dois utiliser “getSupportFragmentManager ()”. Bien sûr, ce principe fonctionnera également avec une classe de fragments étendant “Fragment”, mais vous devrez alors utiliser “getFragmentManager ()”.

Obtenir la référence de l’exemple suivant.

1. Dans fragment : Créez une variable de référence pour la classe dont l’object est souhaité dans le fragment. Créez simplement une méthode de réglage pour la variable de référence et appelez le setter avant de remplacer fragment de l’activité.

  MyEmployee myEmp; public void setEmployee(MyEmployee myEmp) { this.myEmp = myEmp; } 

2. En activité :

  //we need to pass object myEmp to fragment myFragment MyEmployee myEmp = new MyEmployee(); MyFragment myFragment = new MyFragment(); myFragment.setEmployee(myEmp); FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); ft.replace(R.id.main_layout, myFragment); ft.commit(); 

Pour transmettre un object à un fragment, procédez comme suit:

Stockez d’abord les objects dans Bundle, n’oubliez pas de mettre les outils sérialisables en classe.

  CategoryRowFragment fragment = new CategoryRowFragment(); // pass arguments to fragment Bundle bundle = new Bundle(); // event list we want to populate bundle.putSerializable("eventsList", eventsList); // the description of the row bundle.putSerializable("categoryRow", categoryRow); fragment.setArguments(bundle); 

Ensuite, récupérez les paquets dans Fragment

  // events that will be populated in this row mEventsList = (ArrayList)getArguments().getSerializable("eventsList"); // description of events to be populated in this row mCategoryRow = (CategoryRow)getArguments().getSerializable("categoryRow");