Je crée une application avec Fragments
et dans l'un d'entre eux, j'ai créé un constructeur non par défaut et j'ai reçu cet avertissement:
Avoid non-default constructors in fragments: use a default constructor plus Fragment#setArguments(Bundle) instead
Quelqu'un peut-il me dire pourquoi ce n'est pas une bonne idée?
Pouvez-vous également suggérer comment j'accomplirais ceci:
public static class MenuFragment extends ListFragment {
public ListView listView1;
Categories category;
//this is my "non-default" constructor
public MenuFragment(Categories category){
this.category = category;
}....
Sans utiliser le constructeur non par défaut?
android
android-fragments
NoirChapeauSamouraï
la source
la source
Réponses:
Créez un objet bundle et insérez vos données (dans cet exemple votre
Category
objet). Attention, vous ne pouvez pas passer cet objet directement dans le bundle, sauf s'il est sérialisable. Je pense qu'il est préférable de créer votre objet dans le fragment et de ne mettre qu'un identifiant ou quelque chose d'autre dans le paquet. Voici le code pour créer et attacher un bundle:Après cela, dans vos données d'accès au fragment:
C'est tout.
la source
Parcelable
objets. De plus, vous ne devez pas passer de aContext
, car ces informations sont accessibles via lagetActivity()
méthode du fragment .Type value = getArguments().getType("key");
?newInstance()
méthode. Par exemple:public static FragmentName newInstance(your variables){}
. Comme le recommande la documentation Android, ne faites pas de constructeur avec des paramètres, car celui par défaut (sans paramètres) sera appelé automatiquement après le redémarrage de votre fragment.Il semble qu'aucune des réponses ne réponde réellement "pourquoi utiliser un bundle pour passer des paramètres plutôt que des constructeurs non par défaut"
La raison pour laquelle vous devriez passer des paramètres via bundle est que lorsque le système restaure un
fragment
(par exemple lors d'un changement de configuration), il restaurera automatiquement votre fichierbundle
.Les rappels aiment
onCreate
ouonCreateView
devraient lire les paramètres debundle
- de cette façon, vous êtes assuré de restaurerfragment
correctement l'état du correctement dans le même étatfragment
avec lequel il a été initialisé (notez que cet état peut être différent de celuionSaveInstanceState bundle
qui est passé auonCreate/onCreateView
)La recommandation d'utiliser la
newInstance()
méthode statique n'est qu'une recommandation. Vous pouvez utiliser un constructeur non par défaut, mais assurez-vous de renseigner les paramètres d'initialisation à l'bundle
intérieur du corps de ce constructeur. Et lisez ces paramètres dans les méthodesonCreate()
ouonCreateView()
.la source
Vous
Fragment
ne devriez pas avoir de constructeurs à cause de la façon dont ils l'FragmentManager
instancient. Vous devez avoir unenewInstance()
méthode statique définie avec les paramètres dont vous avez besoin, puis les regrouper et les définir comme arguments du fragment, auxquels vous pourrez accéder ultérieurement avec leBundle
paramètre.Par exemple:
Et lisez ces arguments sur
onCreate
:De cette façon, s'il est détaché et ré-attaché, l'état de l'objet peut être stocké via les arguments, un peu comme
bundles
attaché àIntent
s.la source
Si vous utilisez un paramètre pour une classe. essaye ça
la source
FragmentManager
, vous perdrez mSomeInstance.Je pense qu'il n'y a pas de différence entre le constructeur statique et deux constructeurs (vide et paramétré qui stocke les arguments dans le paquet d'arguments d'un Fragment), très probablement, cette règle empirique est créée pour réduire la probabilité d'oublier d'implémenter le constructeur sans arg en Java , qui n'est pas généré implicitement en cas de surcharge.
Dans mes projets, j'utilise Kotlin et j'implémente des fragments avec un constructeur primaire sans argument et un constructeur secondaire pour les arguments qui les stocke simplement dans un bundle et le définit comme arguments Fragment, tout fonctionne bien.
la source
Si le fragment utilise des constructeurs autres que ceux par défaut après la modification de la configuration, le fragment perdra toutes les données.
la source