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?