2014-07-25 2 views
5

J'ai donc ce morceau de code ici, je crée un nouveau fragment et le remplace par un autre fragment. Cela fonctionne bien. Cependant, j'ai remarqué que sur la première ligne le constructeur est appelé mais les onAttach(), onCreate() ne le sont pas. Si je devais décommenter la deuxième ligne, cela ne fonctionnera pas car updateItem(URL) nécessite un webView initié dans la fonction onCreate().Remplacer des fragments dans une activité n'appelant pas Onttach, onCreate, onCreateView, etc

DetailViewFragment detailFragment = new DetailViewFragment(); 
//detailFragment.updateItem(URL); 
FragmentTransaction ft = getFragmentManager().beginTransaction(); 
ft.replace(R.id.displayList, detailFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
ft.addToBackStack(null); 
ft.commit(); 

Apprécierez toute aide qui fonctionnera avec la deuxième ligne décommentée.

+0

Je crois que onAttach, onCreate, etc. ne sont pas appelés tant que le fragment n'a pas été validé pour l'activité. Donc, ils devraient être appelés sur la dernière ligne de ce code. Docs Android sur le cycle de vie: http://developer.android.com/reference/android/app/Fragment.html#Lifecycle Avez-vous essayé d'utiliser ft.add (...)? –

Répondre

1

Les onAttach(), onCreate(), etc. ne seront pas appelés avant que le FragmentManager ait réellement validé la modification. Ainsi, un certain temps après commit() est appelée sur la transition. Si vous devez passer l'URL au Fragment depuis le début, ajoutez-le au groupe d'arguments du fragment avant que vous appelez commit(). Ensuite, vous serez en mesure d'accéder à l'URL dans votre onCreate() ou d'autres méthodes de cycle de vie. Donc, vous voulez quelque chose comme ceci:

DetailViewFragment detailFragment = new DetailViewFragment(); 
Bundle args = new Bundle(); 
args.putString(DetailViewFragment.INIT_URL, URL); 
detailFragment.setArguments(args); 
ft.replace(R.id.displayList, detailFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 
ft.addToBackStack(null); 
ft.commit(); 

Maintenant dans votre onCreate() vous pouvez appeler pour obtenir le paquet et récupérer l'URL qui a été adoptée par votre activité.

3

API Niveau 23 onAttach(Context context) œuvres
API Niveau 22 onAttach(Activity activity) œuvres

La mise en œuvre des deux méthodes a marché pour moi:

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
} 
0

Une autre solution serait d'appeler getSupportFragmentManager().executePendingTransactions(); juste après la validation. Prenez garde que la transcation sera alors synchrone.

Questions connexes