Alors que @yydl donne une raison convaincante sur la raison pour laquelle la newInstance
est meilleure :
Si Android décide de recréer le constructeur sans argument de votre fragment. Donc surcharger le constructeur n'est pas une solution.
il est encore tout à fait possible d'utiliser un Constructeur . Pour comprendre pourquoi, il faut d'abord voir pourquoi la solution de contournement ci-dessus est utilisée par Android.
Avant qu'un fragment puisse être utilisé, une instance est nécessaire. Android appelle YourFragment()
(le pas d'arguments constructor) pour construire une instance du fragment. Ici, tout constructeur surchargé que vous écrivez sera ignoré, car Android ne peut pas savoir lequel utiliser.
Au cours de la vie d'une activité, le fragment est créé comme ci-dessus et détruit plusieurs fois par Android. Cela signifie que si vous placez des données dans l'objet fragment lui-même, elles seront perdues lorsque le fragment sera détruit.
Pour contourner ce problème, Android vous demande de stocker les données à l'aide d'un fichier de type Bundle
(appel setArguments()
), qui peut ensuite être consulté à partir de YourFragment
. Argumentaire bundle
sont protégés par Android, et sont donc garantis d'être persistant .
Une façon de définir ce regroupement est d'utiliser un fichier statique de type newInstance
méthode :
public static YourFragment newInstance (int data) {
YourFragment yf = new YourFragment()
/* See this code gets executed immediately on your object construction */
Bundle args = new Bundle();
args.putInt("data", data);
yf.setArguments(args);
return yf;
}
Cependant, un constructeur :
public YourFragment(int data) {
Bundle args = new Bundle();
args.putInt("data", data);
setArguments(args);
}
peut faire exactement la même chose que le newInstance
méthode.
Naturellement, cela échouerait, et c'est l'une des raisons pour lesquelles Android veut que vous utilisiez l'option newInstance
méthode :
public YourFragment(int data) {
this.data = data; // Don't do this
}
Pour plus d'explications, voici la classe des fragments d'Android :
/**
* Supply the construction arguments for this fragment. This can only
* be called before the fragment has been attached to its activity; that
* is, you should call it immediately after constructing the fragment. The
* arguments supplied here will be retained across fragment destroy and
* creation.
*/
public void setArguments(Bundle args) {
if (mIndex >= 0) {
throw new IllegalStateException("Fragment already active");
}
mArguments = args;
}
Notez qu'Android demande que les arguments soient définis seulement lors de la construction, et garantit que ceux-ci seront conservés.
EDIT : Comme l'a souligné dans les commentaires @JHH, si vous fournissez un constructeur personnalisé qui nécessite certains arguments, alors Java ne fournira pas à votre fragment un pas d'argument Constructeur par défaut. Il faudrait donc que vous définissiez un pas d'argument ce qui représente du code que vous pourriez éviter avec l'option newInstance
méthode d'usine.
EDIT : Android ne permet plus d'utiliser un constructeur surchargé pour les fragments. Vous devez utiliser le newInstance
méthode.
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.