Mam fragment w działaniu, którego używam jako szuflady nawigacji. Zawiera przyciski, które po kliknięciu uruchamiają nowe działania (startActivity z fragmentu po prostu wywołuje startActivity na bieżącej aktywności).
Przez całe życie nie potrafię pojąć, jak zakończę obecną działalność po rozpoczęciu nowej.
Szukam czegoś takiego we fragmencie:
@Override
public void onClick(View view) {
// TODO Auto-generated method stub
if (view == mButtonShows) {
Intent intent = new Intent(view.getContext(), MyNewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
}
Ale wydaje się, że Fragment.class nie implementuje finish () (tak jak implementuje startActivity (...)).
Chciałbym, aby backstack aktywności został wyczyszczony po uruchomieniu drugiej aktywności. (więc wycofanie się z nowej czynności technicznie spowodowałoby przeniesienie ich z powrotem do programu uruchamiającego)
getActivity()
może byćnull
w niektórych przypadkach. Co wtedy powinniśmy zrobić?finish
.Cóż, właściwie ...
Nie chciałbym, żeby Fragment próbował zakończyć Ćwiczenie. Moim zdaniem to nadaje temu fragmentowi zbyt dużą władzę. Zamiast tego skorzystałbym z przewodnika tutaj: http://developer.android.com/training/basics/fragments/communicating.html
Niech fragment zdefiniuje interfejs, który musi zaimplementować działanie. Nawiąż połączenie z działaniem, a następnie pozwól, aby działanie zdecydowało, co zrobić z informacjami. Jeśli czynność chce się sama zakończyć, to może.
źródło
Jak wspomniał Jon F Hancock , w ten sposób fragment może „zamknąć” czynność, sugerując jej zamknięcie. To sprawia, że fragment jest przenośny, ponieważ jest tego powodem. Jeśli używasz go w innym działaniu, możesz nie chcieć go zamykać.
Poniższy kod to fragment działania i fragment z przyciskiem Zapisz i Anuluj.
PlayerActivity
PlayerInfoFragment, który zawiera interfejs, który musi zaimplementować działanie wywołujące.
źródło
Za każdym razem, gdy zamykam fragment zakończeniem, cała czynność się zamyka. Według dokumentów fragmenty powinny pozostać tak długo, jak długo trwa aktywność rodziców.
Zamiast tego stwierdziłem, że mogę zmienić widoki z powrotem do działania nadrzędnego za pomocą tej instrukcji: setContentView (R.layout.activity_main);
To wraca z powrotem do rodzicielskiej aktywności.
Mam nadzieję, że pomoże to komuś, kto może tego szukać.
źródło
Bardzo prosty...
1- Po prostu złap aktywność
getActivity()
we fragmencie2- wtedy zadzwoń
finish();
Więc po prostu
getActivity().finish();
skończę działalność rodzicielską.źródło
Należy użyć metody getActivity (), aby zakończyć działanie z fragmentu.
źródło
We fragmentach użyj metody getActivity.finishAffinity ()
Spowoduje to usunięcie całego fragmentu, który został wypchnięty przez bieżącą aktywność ze stosu z działaniem również ...
źródło
Spróbuj tego. Nie powinno być żadnego ostrzeżenia ...
źródło
15 czerwca 2020 - zaktualizowana odpowiedź.
Masz dwie opcje dla Java i Kotlin. Jednak logika obu sposobów jest taka sama. Należy wywołać aktywność po wywołaniu metody finish () .
Jeśli Twoja aktywność nie może być zerowa, użyj Answer_1 . Jeśli jednak twoja aktywność może być zerowa , użyj Answer_2 .
@canerkaseler
źródło
tak
Fragment.class
nie realizujefinish()
Podczas pracy z fragmentami, zamiast używać tego lub odwoływać się do kontekstu, zawsze używaj
getActivity()
. Powinieneś zadzwonićźródło