J'ai trouvé que c'était un problème TRÈS déroutant (l'un des nombreux qui jonchent le paysage Android).
setArguments()
est une solution de contournement pour le besoin très peu utile d'Android d'avoir un constructeur sans paramètre disponible pour les fragments.
Ma confusion est venue par vagues. D'abord, les méthodes que vous remplacez naturellement dans vos Fragment
(par exemple onCreate
, onCreateView
) reçoivent un Bundle
qui représente le savedInstanceState
de votre Fragment
. Cet état d'instance a apparemment NOTHING quoi que ce soit à faire avec les valeurs que vous stockez par l'intermédiaire de setArguments()
et récupérer via getArguments()
. Les deux utilisent un Bundle
les deux Bundles
sont susceptibles d'être accédées au sein de la même méthode surchargée, elles n'ont rien à voir l'une avec l'autre.
Deuxièmement, il n'est pas clair comment Android utilise setArguments()
. Android appelle votre constructeur sans paramètre pour reconstruire votre Fragment
sur la rotation, mais apparemment, ALSO appellera n'importe qui setArguments()
a été appelée pour la dernière fois lorsque la méthode Fragment
a été construit.
Huh ????
Incroyable, mais vrai. Toute cette création Bundles
avec setArguments()
La folie existe pour compenser le besoin d'un système sans paramètre. Fragment
constructeur.
En bref, j'utilise la méthode statique newInstance
pour créer mon Fragment
.
public MyFragment() {
//satisfy Android
}
public static MyFragment newInstance(long record_id) {
Log.d("MyFragment", "Putting " + record_id + " into newInstance");
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putLong("record_id", record_id);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* Perform an immediate check of arguments,
* which ARE NOT the same as the bundle used
* for saved instance state.
*/
Bundle args = getArguments();
if(args != null) {
record_id = args.getLong("record_id");
Log.d("MyFragment", "found record_id of " + String.valueOf(record_id));
}
if(savedInstanceState != null) {
//now do something with savedInstanceState
}
}