Oui, ils le font.
Vous ne devriez pas vraiment surcharger le constructeur de toute façon. Vous devriez avoir un newInstance()
méthode statique définie et passage de tout paramètre via les arguments (bundle)
Par exemple :
public static final AlertDialogFragment newInstance(int title, String message)
{
AlertDialogFragment f = new AlertDialogFragment();
Bundle bdl = new Bundle(2);
bdl.putInt(EXTRA_TITLE, title);
bdl.putString(EXTRA_MESSAGE, message);
f.setArguments(bdl);
return f;
}
Et bien sûr, en récupérant les arguments de cette façon :
@Override
public Dialog onCreate(Bundle savedInstanceState)
{
title = getArguments().getInt(EXTRA_TITLE);
message = getArguments().getString(EXTRA_MESSAGE);
//...
//etc
//...
}
Ainsi, en cas de détachement et de rattachement, l'état de l'objet peut être stocké dans les arguments. Un peu comme les bundles attachés aux Intents.
Motif - Lecture supplémentaire
J'ai pensé que je pourrais expliquer pourquoi pour les personnes qui se demandent pourquoi.
Si vous vérifiez : https://Android.googlesource.com/platform/frameworks/support/+/refs/heads/master/v4/java/Android/support/v4/app/Fragment.java
Vous verrez le instantiate(..)
dans la méthode Fragment
appelle la classe newInstance
méthode. [http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance()](http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#newInstance()) Explique pourquoi, lors de l'instanciation, il vérifie que l'accesseur est public
et que ce chargeur de classe lui permette d'y accéder.
C'est une méthode assez désagréable dans l'ensemble, mais elle permet à la FragmentManger
pour tuer et recréer Fragments
avec des états. (Le sous-système Android fait des choses similaires avec Activities
).
Exemple de classe
On me demande souvent d'appeler newInstance
(Ne confondez pas cette méthode avec la méthode de classe. L'exemple de la classe entière devrait montrer l'utilisation.
/**
* Created by chris on 21/11/2013
*/
public class StationInfoAccessibilityFragment extends BaseFragment implements JourneyProviderListener {
public static final StationInfoAccessibilityFragment newInstance(String crsCode) {
StationInfoAccessibilityFragment fragment = new StationInfoAccessibilityFragment();
final Bundle args = new Bundle(1);
args.putString(EXTRA_CRS_CODE, crsCode);
fragment.setArguments(args);
return fragment;
}
// Views
LinearLayout mLinearLayout;
/**
* Layout Inflater
*/
private LayoutInflater mInflater;
/**
* Station Crs Code
*/
private String mCrsCode;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCrsCode = getArguments().getString(EXTRA_CRS_CODE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mInflater = inflater;
return inflater.inflate(R.layout.fragment_station_accessibility, container, false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mLinearLayout = (LinearLayout)view.findViewBy(R.id.station_info_accessibility_linear);
//Do stuff
}
@Override
public void onResume() {
super.onResume();
getActivity().getSupportActionBar().setTitle(R.string.station_info_access_mobility_title);
}
// Other methods etc...
}
25 votes
Dans certaines versions d'Android (au moins ICS), vous pouvez aller dans Paramètres -> Options du développeur et activer "Ne pas conserver les activités". Cela vous donnera un moyen déterministe de tester les cas où un constructeur sans argument est nécessaire.
0 votes
J'ai eu le même problème. J'assignais les données du bundle à la place des variables membres (en utilisant un ctor non par défaut). Mon programme ne se plantait pas lorsque je tuais l'application - cela se produisait uniquement lorsque le planificateur mettait mon application en veilleuse pour "gagner de la place". J'ai découvert cela en allant dans Task Mgr et en ouvrant une tonne d'autres applications, puis en rouvrant mon application en mode débogage. Elle a planté à chaque fois. Le problème a été résolu lorsque j'ai utilisé la réponse de Chris Jenkins pour utiliser les bundle args.
0 votes
Ce fil de discussion pourrait vous intéresser : stackoverflow.com/questions/15519214/
8 votes
Une remarque pour les futurs lecteurs : si votre
Fragment
ne déclare aucun constructeur, alors par défaut, une classe de type Constructeur public vide sera implicitement faite pour vous (il s'agit de comportement standard de Java ). Vous faites pas doivent explicitement déclarer un constructeur vide à moins que vous n'ayez également déclaré d'autres constructeurs (par exemple, ceux avec des arguments).0 votes
Je mentionnerai simplement qu'IntelliJ IDEA, au moins pour la version 14.1, fournit un avertissement vous avertissant du fait que vous ne devriez pas avoir un constructeur non par défaut dans un fragment.
0 votes
Cela se produit à cause d'une condition de mémoire faible / mort du processus. Voir stackoverflow.com/questions/49046773/