Ce que j'ai tendance à faire, et je pense que c'est ce que Google voulait que les développeurs fassent aussi, c'est de continuer à obtenir les extras d'une Intent
dans un Activity
puis de transmettre toute donnée supplémentaire aux fragments en les instanciant avec des arguments.
Il y a en fait un exemple sur le blog Android dev qui illustre ce concept, et vous le verrez également dans plusieurs des démos d'API. Bien que cet exemple spécifique soit donné pour des fragments d'API 3.0+, le même flux s'applique lorsque vous utilisez des fragments d'API 3.0+. FragmentActivity
y Fragment
de la bibliothèque de soutien.
Vous récupérez d'abord les extras d'intention comme d'habitude dans votre activité et les transmettez comme 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'invoquer directement le constructeur, il est probablement plus facile d'utiliser une méthode statique qui insère les arguments dans le fragment pour vous. Une telle méthode est souvent appelée newInstance
dans le Exemples donnés par Google . Il existe en fait un newInstance
méthode dans DetailsFragment
Je ne sais donc pas pourquoi il n'est pas utilisé dans l'extrait ci-dessus...
De toute façon, tous les extras fournis comme argument lors de la création du fragment, seront disponibles en appelant getArguments()
. Puisque cela renvoie un Bundle
son utilisation est similaire à celle des extras dans un projet de l'Union européenne. 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)
}