101 votes

Où/Comment getIntent().getExtras() dans un Android Fragment?

Avec des Activités, j'ai utilisé pour ce faire:

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 à l'aide de Fragments? Je suis l'aide de la bibliothèque de compatibilité v4 également.

Faut-il aller dans le FragmentActivity? Ou le Fragment? Et quelle Méthode faut-il aller? onCreate? onCreateView? de l'autre?

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

EDIT: Il est intéressant de noter que je suis en train d'essayer de garder de l'Activité 1 comme une Activité (ou en fait ListActivity où je suis de passage à l'intention de la listitem quand on clique dessus) et ensuite passer à un ensemble d'onglets-fragments (par le biais d'un Fragment de l'Activité) et j'ai besoin d'onglet pour être en mesure d'obtenir les extras. (J'espère que c'est possible?)

168voto

meeeee Points 825

vous pouvez toujours utiliser Item = getIntent().getExtras().getString("name"); dans le fragment, vous avez juste besoin d'appeler getActivity() tout d'abord:

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 crois que c'est ce que Google destine aux développeurs d'en faire trop, est de toujours obtenir les extras à partir d'un Intent en Activity puis à transmettre toutes les données supplémentaires à des fragments par l'instanciation d'entre eux avec des arguments.

Il y a en fait un exemple sur l'Android dev blog qui illustre ce concept, et vous verrez cela dans plusieurs de l'API démos trop. Bien que cet exemple est donné pour API 3.0+ fragments, le même flux s'applique lors de l'utilisation d' FragmentActivity et Fragment à partir de la bibliothèque de prise en charge.

Vous d'abord récupérer l'intention des extras comme d'habitude dans votre activité et de les transmettre en tant qu'arguments à ce 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 de directement en appelant le constructeur, il est probablement plus facile d'utiliser une méthode statique qui obstrue les arguments dans le fragment pour vous. Une telle méthode est souvent appelée newInstance dans les exemples donnés par Google. En fait il y a un newInstance méthode de DetailsFragment, donc je ne suis pas sûr pourquoi il n'est pas utilisé dans l'extrait ci-dessus...

De toute façon, tous les extras fourni comme argument lors de la création de ce fragment, sera disponible en appelant getArguments(). Depuis ce 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)

}

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