101 votes

Où/Comment faire pour getIntent().getExtras() dans un fragment d'Android ?

Avec Activités, j'avais l'habitude de faire ça :

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 faire en utilisant les Fragments ? J'utilise également la bibliothèque de compatibilité v4.

Est-ce qu'il va dans l'activité FragmentActivity ? Ou dans le Fragment lui-même ? Et dans quelle méthode est-il placé ? onCreate ? onCreateView ? une autre ?

Et puis-je voir un exemple de code s'il vous plaît ?

EDIT : Il est important de noter que j'essaie de conserver l'activité 1 comme une activité (ou en fait ListActivity où je transmets l'intention de l'élément de la liste lorsqu'il est cliqué) et de la transmettre ensuite à un ensemble de fragments à onglets (par le biais d'une activité de fragment) et j'ai besoin que l'un ou l'autre des onglets soit capable d'obtenir les extras. (J'espère que c'est possible ?)

168voto

meeeee Points 825

Vous pouvez toujours utiliser

String Item = getIntent().getExtras().getString("name");

dans le fragment vous devez juste appeler getActivity() d'abord :

String Item = getActivity().getIntent().getExtras().getString("name");

Cela vous évite d'avoir à écrire du code.

108voto

MH. Points 21672

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)

}

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