775 votes

Meilleure pratique pour l'instanciation d'un nouveau fragment d'Android

J'ai vu deux pratiques générales pour instancier un nouveau Fragment dans une application :

Fragment newFragment = new MyFragment();

y

Fragment newFragment = MyFragment.newInstance();

La deuxième option fait appel à une méthode statique newInstance() y généralement contient la méthode suivante.

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}

Au début, je pensais que le principal avantage était le fait que je pouvais surcharger la méthode newInstance() afin de donner de la flexibilité lors de la création de nouvelles instances d'un Fragment - mais je pouvais aussi le faire en créant un constructeur surchargé pour le Fragment.

J'ai raté quelque chose ?

Quels sont les avantages d'une approche par rapport à une autre ? Ou s'agit-il simplement d'une bonne pratique ?

0 votes

Lorsqu'il y a des paramètres, il n'y a pas de choix, et cette question est largement traitée ici. Cependant, la question reste posée pour la construction sans argument du fragment.

1 votes

Après avoir appris le factory pattern et comment une classe appelante qui n'instancie pas elle-même un objet aide à les découpler, j'ai pensé que ce serait un point fort pour la méthode newInstance(). Ai-je tort ? Je n'ai pas vu cet argument spécifique parlé comme un avantage.

1voto

Vikram Points 1
  1. Idéalement, nous ne devrions rien passer dans le constructeur de fragment, le constructeur de fragment devrait être vide ou par défaut.
  2. Maintenant la deuxième question est, que faire si nous voulons passer une variable d'interface ou des paramètres-
    1. Nous devrions utiliser Bundle pour passer les données.
    2. Pour l'interface, nous pouvons putParceble dans le paquet et faire en sorte que cette interface implémente parceble
    3. Si possible, nous pouvons implémenter cette interface dans l'activité et dans le fragment, nous pouvons initialiser l'écouteur en OnAttach où nous avons context[ (context) Listener].

Ainsi, lors d'un changement de configuration (par exemple, changement de police), l'écouteur de recréation d'activité ne se met pas en mode uninitialize et nous pouvons éviter une exception de pointeur nul.

0voto

Mahesh Points 1655

La meilleure façon d'instancier le fragment est d'utiliser la méthode par défaut. Fragment.instancié ou créer une méthode d'usine pour instancier le fragment.
Attention : toujours créer un constructeur vide dans le fragment autre que la restauration de la mémoire du fragment va jeter une exception d'exécution.

0voto

Morozov Points 834

Vous pouvez utiliser quelque chose comme ceci :

val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, YourFragment::class.java.name)

parce que cette réponse est maintenant déprécié

0voto

Manas Points 21

Créer une instance du fragment en utilisant le code kotlin.

Activité d'écriture

val fragment = YourFragment.newInstance(str = "Hello",list = yourList)

Écrire en fragment

fun newInstance(str: String, list: ArrayList<String>): Fragment {
        val fragment = YourFragment()
        fragment.arguments = Bundle().apply {
            putSerializable("KEY_STR", str)
            putSerializable("KEY_LIST", list)
        }
        return fragment
    }

En utilisant le même fragment, récupérer les données de la liasse.

val str = arguments?.getString("KEY_STR") as? String
val list = arguments?.getSerializable("KEY_LIST") as? ArrayList<String>

-2voto

Vadim Star Points 57

setArguments() est inutile. Ça n'apporte que du désordre.

public class MyFragment extends Fragment {

    public String mTitle;
    public String mInitialTitle;

    public static MyFragment newInstance(String param1) {
        MyFragment f = new MyFragment();
        f.mInitialTitle = param1;
        f.mTitle = param1;
        return f;
    }

    @Override
    public void onSaveInstanceState(Bundle state) {
        state.putString("mInitialTitle", mInitialTitle);
        state.putString("mTitle", mTitle);
        super.onSaveInstanceState(state);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
        if (state != null) {
            mInitialTitle = state.getString("mInitialTitle");
            mTitle = state.getString("mTitle");
        } 
        ...
    }
}

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