Frage Ersetzen von Fragmenten in einer Aktivität, die onAttach, onCreate, onCreateView usw. nicht aufruft


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 der onAttach(), onCreate() usw. sind nicht. Wenn ich die zweite Zeile auskommentieren würde, würde das nicht funktionieren updateItem(URL) erfordert ein WebView, das in der onCreate () - Funktion initiiert wird.

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 unkommentierten zweiten Zeile arbeiten lässt.


7
2017-07-25 12:38


Ursprung


Antworten:


Das onAttach(), onCreate()usw. wird erst nach der FragmentManager hat die Änderung tatsächlich begangen. Also, etwas später commit() wird am Übergang genannt. Wenn Sie die URL an die Fragment Fügen Sie es von Anfang an dem Argumentpaket des Fragments hinzu Vor du rufst an commit(). Dann haben Sie Zugriff auf die URL in Ihrem onCreate() oder andere Lebenszyklusmethoden. Du wirst also so etwas 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 deinem onCreate() Du kannst anrufen getArguments() um das Paket zu erhalten und die URL abzurufen, die von Ihrer Aktivität übergeben wurde.


4
2017-07-25 13:05



API-Stufe 23 onAttach(Context context) funktioniert
API-Stufe 22 onAttach(Activity activity) funktioniert

Die Implementierung beider Methoden funktionierte für mich:

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

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

4
2017-09-20 15:38



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


0
2017-10-02 11:58