web-dev-qa-db-fra.com

Où / Comment obtenir GetIntent (). GetExtras () dans un fragment Android?

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?)

101
KickingLettuce

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)

}
108
MH.

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.

169
meeeee