54 votes

Création d'un fragment: constructeur vs newInstance ()

J'ai récemment il s'est fatigué d'avoir à constamment savez String touches pour passer des arguments en Bundles lors de la création de mon Fragments. J'ai donc décidé de faire des constructeurs pour ma Fragments qui permettrait de prendre les paramètres je voulais mettre, et mettre ces variables dans l' Bundles avec le corriger String touches, donc en éliminant la nécessité pour les autres Fragments et Activities avoir besoin de connaître ces clés.

public ImageRotatorFragment() {
    super();
    Log.v(TAG, "ImageRotatorFragment()");
}

public ImageRotatorFragment(int imageResourceId) {
    Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");

    // Get arguments passed in, if any
    Bundle args = getArguments();
    if (args == null) {
        args = new Bundle();
    }
    // Add parameters to the argument bundle
    args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
    setArguments(args);
}

Et puis je sortir ces arguments, comme d'habitude.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.v(TAG, "onCreate");

    // Set incoming parameters
    Bundle args = getArguments();
    if (args != null) {
        mImageResourceId = args.getInt(KEY_ARG_IMAGE_RES_ID, StaticData.getImageIds()[0]);
    }
    else {
        // Default image resource to the first image
        mImageResourceId = StaticData.getImageIds()[0];
    }
}

Cependant, les Peluches a pris le problème avec cela, en disant ne pas avoir des sous-classes d' Fragment avec des constructeurs avec d'autres paramètres, m'oblige à utiliser @SuppressLint("ValidFragment") à même d'exécuter l'application. Le truc, c'est que ce code fonctionne parfaitement bien. Je peux utiliser ImageRotatorFragment(int imageResourceId) ou de la vieille école méthode ImageRotatorFragment() et appelez - setArguments() manuellement. Quand Android besoins pour recréer le Fragment (changement d'orientation ou de peu de mémoire), il appelle l' ImageRotatorFragment() constructeur et ensuite passe le même argument Bundle avec mes valeurs, qui sont définies correctement.

J'ai donc été à la recherche de la "suggéré" de la démarche et de voir beaucoup d'exemples à l'aide de newInstance() créer Fragments avec des paramètres, ce qui semble faire la même chose de mon constructeur. J'ai donc fait mon propre pour le tester et il fonctionne aussi parfaitement comme avant, moins de Peluches pleurnicher à son sujet.

public static ImageRotatorFragment newInstance(int imageResourceId) {
    Log.v(TAG, "newInstance(int imageResourceId)");

    ImageRotatorFragment imageRotatorFragment = new ImageRotatorFragment();

    // Get arguments passed in, if any
    Bundle args = imageRotatorFragment.getArguments();
    if (args == null) {
        args = new Bundle();
    }
    // Add parameters to the argument bundle
    args.putInt(KEY_ARG_IMAGE_RES_ID, imageResourceId);
    imageRotatorFragment.setArguments(args);

    return imageRotatorFragment;
}

Personnellement, je trouve que l'utilisation de constructeurs, il est beaucoup plus pratique courante que de savoir utiliser newInstance() et passage de paramètres. Je crois que vous pouvez utiliser ce même constructeur technique avec les Activités et les Peluches ne va pas s'en plaindre. Donc en gros ma question est, pourquoi est-ce que Google veux pas que vous utilisez des constructeurs avec paramètres pour Fragments?

Ma conjecture est que si vous n'essayez pas de définir une variable d'instance, sans l'aide de l' Bundle, ce qui n'est pas assignée à l' Fragment soit recréé. À l'aide d'un static newInstance() méthode, le compilateur ne vous permettront pas d'accéder à une variable d'instance.

public ImageRotatorFragment(int imageResourceId) {
    Log.v(TAG, "ImageRotatorFragment(int imageResourceId)");

    mImageResourceId = imageResourceId;
}

Je n'ai toujours pas l'impression que c'est une raison suffisante pour interdire l'utilisation de paramètres dans les constructeurs. Quelqu'un d'autre d'avoir un aperçu de ce?

60voto

CommonsWare Points 402670

Personnellement, je trouve que l'utilisation de constructeurs, il est beaucoup plus pratique courante que de savoir utiliser newInstance() et passage de paramètres.

La méthode de fabrique de modèle est utilisé assez fréquemment dans le développement de logiciels modernes.

Donc en gros ma question est, pourquoi est-ce que Google veux pas que vous utilisez des constructeurs avec paramètres pour des Fragments?

Vous avez répondu à votre propre question:

Ma conjecture est que si vous n'essayez pas de définir une variable d'instance, sans utiliser le Bundle, qui n'obtiendrez pas définie lorsque le Fragment soit recréé.

Correct.

Je n'ai toujours pas l'impression que c'est une raison suffisante pour interdire l'utilisation de paramètres dans les constructeurs.

Vous êtes les bienvenus pour votre avis. Vous êtes les bienvenus pour désactiver cette Charpie chèque, soit par le constructeur ou par l'espace de travail de la mode.

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