Avec Activités, je faisais ceci:
Dans l'activité 1:
Intent i = new Intent(getApplicationContext(), MyFragmentActivity.class);
i.putExtra("name", items.get(arg2));
i.putExtra("category", Category);
startActivity(i);
Dans l'activité 2:
Item = getIntent().getExtras().getString("name");
Comment faites-vous cela en utilisant des fragments? J'utilise également la bibliothèque de compatibilité v4.
Est-ce que ça va dans FragmentActivity? Ou le fragment réel? Et quelle méthode y a-t-il? onCreate? onCreateView? un autre?
Et puis-je voir un exemple de code s'il vous plaît?
EDIT: Il est à noter que j'essaie de conserver l'activité 1 en tant qu'activité (ou en fait de ListActivity où je transmets l'intention du listitem lorsque je clique dessus), puis de passer à un ensemble de fragments tabulés (via une activité de fragment) et à I besoin soit de l'onglet pour pouvoir obtenir les extras. (J'espère que c'est possible?)
Ce que j'ai tendance à faire, et je pense que c’est ce que Google a également voulu faire pour les développeurs, c’est toujours d’obtenir les extras d’un Intent
dans un Activity
, puis de transmettre toute donnée supplémentaire à des fragments en instanciant eux avec des arguments.
Il y a en fait n exemple sur le Android blog de dev qui illustre ce concept, et vous le verrez également dans plusieurs démonstrations de l'API. Bien que cet exemple spécifique soit donné pour les fragments API 3.0+, le même flux s'applique lorsque vous utilisez FragmentActivity
et Fragment
à partir de la bibliothèque de support.
Vous récupérez d'abord les extras d'intention comme d'habitude dans votre activité et les transmettez en tant qu'arguments au fragment:
public static class DetailsActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// (omitted some other stuff)
if (savedInstanceState == null) {
// During initial setup, plug in the details fragment.
DetailsFragment details = new DetailsFragment();
details.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(
Android.R.id.content, details).commit();
}
}
}
Au lieu d'appeler directement le constructeur, il est probablement plus facile d'utiliser une méthode statique qui connecte les arguments au fragment pour vous. Une telle méthode est souvent appelée newInstance
dans exemples donnés par Google . Il y a en fait une méthode newInstance
dans DetailsFragment
, donc je ne sais pas pourquoi elle n'est pas utilisée dans l'extrait de code ci-dessus ...
Quoi qu'il en soit, tous les extras fournis comme arguments lors de la création du fragment seront disponibles en appelant getArguments()
. Comme ceci retourne un Bundle
, son utilisation est similaire à celle des extras dans un Activity
.
public static class DetailsFragment extends Fragment {
/**
* 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;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
// (other stuff omitted)
}
vous pouvez toujours utiliser
String Item = getIntent().getExtras().getString("name");
dans la fragment
, il vous suffit d’appeler getActivity()
:
String Item = getActivity().getIntent().getExtras().getString("name");
Cela vous évite d'avoir à écrire du code.