web-dev-qa-db-fra.com

Passer des objets à des fragments

J'ai travaillé avec beaucoup de Fragments récemment et j'ai utilisé deux méthodes distinctes pour passer des objets aux Fragments, mais la seule différence que je peux voir est que dans l'approche adoptée par FragmentOne ci-dessous, l'objet vous passez doit implémenter l'interface Serializable ( et tout ce qui y est associé ).

Y a-t-il des avantages à utiliser l'un par rapport à l'autre?

public class FragmentOne extends Fragment {
    public static final String FRAGMENT_BUNDLE_KEY = 
        "com.example.FragmentOne.FRAGMENT_BUNDLE_KEY";

    public static FragmentOne newInstance(SomeObject someObject) {
        FragmentOne f = new FragmentOne();
        Bundle args = new Bundle();
        args.putSerializable(FRAGMENT_BUNDLE_KEY, someObject);
        f.setArguments(args);
        return f;
    }

    public SomeObject getSomeObject() {
        return (SomeObject) getArguments().getSerializable(FRAGMENT_BUNDLE_KEY);
    }
}

et

public class FragmentTwo extends Fragment {
    SomeObject mSomeObject;  

    public static FragmentTwo newInstance(SomeObject someObject) {
        FragmentTwo fragment = new FragmentTwo();
        fragment.setSomeObject(someObject);
        return fragment;
    }

    public void setSomeObject(SomeObject someObject) {
        mSomeObject = someObject;
    }
}
40
Martyn

Il existe 3 façons de passer des objets à un fragment

Elles sont:

  1. Passer l'objet à travers un passeur est le moyen le plus rapide, mais l'état ne sera pas restauré automatiquement.
  2. setArguments avec Serializable objets est le moyen le plus lent (mais d'accord pour les petits objets, je pense) et vous avez une restauration d'état automatique.
  3. Passer en tant que Parcelable est un moyen rapide (préférez-le au 2e si vous avez une collection d'éléments à passer), et vous avez une restauration d'état automatique.

http://developer.Android.com/reference/Android/os/Parcelable.html

55
logcat

pour Collection comme List:

Je voulais partager mon expérience.

vous devez implémenter Parcelable

Utilisez simplement la méthode putParcelableArrayList.

ArrayList<LClass> localities = new ArrayList<LClass>;
...
Bundle bundle = new Bundle();
bundle.putParcelableArrayList(KEY_LClass_LIST, localities);
fragmentInstance.setArguments(bundle);

return fragmentInstance;

Et récupérez-le en utilisant ...

localities = savedInstanceState.getParcelableArrayList(KEY_LCLass_LIST);

Donc, à moins que vous n'ayez besoin de la liste de tableaux personnalisée pour une autre raison, vous pouvez éviter de faire tout ce travail supplémentaire et n'implémenter que Parcelable pour votre classe Locality.

1