2014-07-25 8 views
5

Also habe ich diesen Code hier, ich erstelle ein neues Fragment und ersetze es durch ein anderes Fragment. Das funktioniert gut. Allerdings habe ich bemerkt, dass in der ersten Zeile der Konstruktor aufgerufen wird, aber die onAttach(), onCreate() usw. nicht sind. Wenn ich die zweite Zeile auskommentieren würde, wird es nicht funktionieren, da updateItem(URL) ein WebView erfordert, das in der onCreate() - Funktion initiiert wird.Fragmente in einer Aktivität ersetzen, die onAttach, onCreate, onCreateView usw. nicht aufruft

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(); 

Würde jede Hilfe schätzen, die das mit der zweiten unkommentierten Zeile arbeiten lassen wird.

+0

Ich glaube, dass onAttach, onCreate, usw. nicht aufgerufen werden, bis das Fragment für die Aktivität festgeschrieben wurde. Sie sollten also in der letzten Zeile dieses Codes aufgerufen werden. Android-Dokumente zum Lebenszyklus: http://developer.android.com/reference/android/app/Fragment.html#Lifecycle Hast du es mit ft.add (...) versucht? –

Antwort

1

Die onAttach(), onCreate() usw. werden nicht aufgerufen, bis die FragmentManager die Änderung tatsächlich vorgenommen hat. So, einige Zeit nach commit() wird auf den Übergang aufgerufen. Wenn Sie die URL von Anfang an an die Fragment übergeben müssen, fügen Sie sie dem Argumentbündel des Fragments hinzu, bevor Sie anrufen, das Sie commit() aufrufen. Dann können Sie auf die URL in Ihrer onCreate() oder anderen Lebenszyklus-Methoden zugreifen. So werden Sie so etwas wie dies wollen:

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(); 

Jetzt in Ihrem onCreate() Sie können rufen das Bündel zu erhalten und die URL abzurufen, die von Ihrer Tätigkeit übergeben wurde.

3

API Stufe 23 onAttach(Context context) Werke
API Stufe 22 onAttach(Activity activity) Werke

beide Methoden Implementierung für mich gearbeitet:

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

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

Eine andere Lösung wäre getSupportFragmentManager().executePendingTransactions(); rufen Sie einfach nach dem Commit. Pass auf, dass die Transcation dann synchron ist.