Beenden der aktuellen Aktivität aus einem Fragment

96

Ich habe ein Fragment in einer Aktivität, die ich als Navigationsschublade verwende. Es enthält Schaltflächen, mit denen beim Klicken neue Aktivitäten gestartet werden (startActivity aus einem Fragment ruft einfach startActivity für die aktuelle Aktivität auf).

Für mein Leben kann ich nicht herausfinden, wie ich die aktuelle Aktivität beenden würde, nachdem ich eine neue begonnen habe.

Ich möchte im Fragment so etwas erreichen:

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

Es scheint jedoch, dass Fragment.class finish () nicht implementiert (wie es startActivity (...) implementiert).

Ich möchte, dass der Aktivitäts-Backstack gelöscht wird, wenn die 2. Aktivität gestartet wird. (Wenn Sie also von der neuen Aktivität zurückdrücken, werden sie technisch auf den Launcher zurückgesetzt.)

NPike
quelle

Antworten:

276

Verwenden thisSie immer, wenn Sie mit Fragmenten arbeiten, anstatt den Kontext zu verwenden oder auf ihn zu verweisen getActivity(). Sie sollten anrufen

getActivity().finish();

um Ihre Aktivität von Fragment zu beenden.

coder_For_Life22
quelle
12
getActivity()kann nullin einigen Fällen sein. Was sollen wir dann tun?
Matjaz Kristl
3
@ user983956 In solchen Fällen ist die Aktivität bereits zerstört, also ruf einfach nicht an finish.
Cristian
2
Als Tipp: getActivity kann null sein, wenn Sie versuchen, es zu verwenden, bevor Sie die Ansicht aufblasen
csanonymus
1
Die Aktivität sollte der Controller / Incharge sein, nicht das Fragment. Sie sollten die Aktivität lieber über eine Rückrufschnittstelle zurückrufen und die Aktivität entscheiden lassen, ob sie sich selbst beenden soll.
Ahmed
1
Wenn Sie Singletons in die Aktivität injiziert haben, vergessen Sie nicht, diese zu zerstören. Dies führt zu Speicherlecks. Wenn Rückrufe auftreten, entfernen Sie diese, z. , if (getActivity ()! = null) {getActivity (). removeCallbacks (); getActivity (). destroy (); }
Omersem
26

Naja eigentlich...

Ich würde das Fragment nicht versuchen lassen, die Aktivität zu beenden. Das gibt dem Fragment meiner Meinung nach zu viel Autorität. Stattdessen würde ich den Leitfaden hier verwenden: http://developer.android.com/training/basics/fragments/communicating.html

Lassen Sie das Fragment eine Schnittstelle definieren, die die Aktivität implementieren muss. Rufen Sie die Aktivität an und lassen Sie die Aktivität entscheiden, was mit den Informationen geschehen soll. Wenn die Aktivität sich selbst beenden möchte, kann sie.

Jon F. Hancock
quelle
2
Das ist ein guter Punkt, da in einer einzelnen Aktivität mehrere Fragmente vorhanden sein können. Wie Sie bereits erwähnt haben, kann ein Fragment über eine Schnittstelle bevorzugt mit seiner Aktivität kommunizieren.
Sasquatch
11

Wie von Jon F. Hancock erwähnt , kann ein Fragment auf diese Weise die Aktivität "schließen", indem es die zu schließende Aktivität vorschlägt. Dies macht das Fragment portabel, da dies der Grund für sie ist. Wenn Sie es in einer anderen Aktivität verwenden, möchten Sie die Aktivität möglicherweise nicht schließen.

Der folgende Code ist ein Ausschnitt aus einer Aktivität und einem Fragment mit einer Schaltfläche zum Speichern und Abbrechen.

PlayerActivity

public class PlayerActivity extends Activity 
    implements PlayerInfo.PlayerAddListener {

    public void onPlayerCancel() {
       // Decide if its suitable to close the activity, 
       //e.g. is an edit being done in one of the other fragments?
       finish();
    }
}

PlayerInfoFragment, das eine Schnittstelle enthält, die die aufrufende Aktivität implementieren muss.

public class PlayerInfoFragment extends Fragment {
   private PlayerAddListener callback; // implemented in the Activity

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

   public interface PlayerAddListener {
       public void onPlayerSave(Player p); // not shown in impl above
       public void onPlayerCancel();
   }

   public void btnCancel(View v) {
      callback.onPlayerCancel(); // the activity's implementation
   }
}
Sasquatch
quelle
1

Jedes Mal, wenn ich das Fragment mit "Fertig stellen" schließe, wird die gesamte Aktivität geschlossen. Gemäß den Dokumenten sollten Fragmente so lange verbleiben, wie die übergeordnete Aktivität erhalten bleibt.

Stattdessen habe ich festgestellt, dass ich mithilfe der folgenden Anweisung die Ansichten der übergeordneten Aktivität zurück ändern kann: setContentView (R.layout.activity_main);

Dies bringt mich zurück zur übergeordneten Aktivität.

Ich hoffe, dass dies jemand anderem hilft, der danach sucht.

Dave Cox
quelle
1

Sehr einfach...

1- Ergreifen Sie einfach die Aktivität getActivity()im Fragment

2- dann anrufen finish();

getActivity().finish();Beenden Sie also einfach die übergeordnete Aktivität.

Ali Nawaz
quelle
1

Sie sollten die Methode getActivity () verwenden, um die Aktivität aus dem Fragment abzuschließen.

getActivity().finish();
Madhu Jayarama
quelle
1

Verwenden Sie in Fragment getActivity.finishAffinity ()

getActivity().finishAffinity();

Es wird auch das gesamte Fragment, das von der aktuellen Aktivität mit der Aktivität verschoben wurde, aus dem Stapel entfernt ...

Tousif Akram
quelle
0

Versuche dies. Es sollte keine Warnung geben ...

            Activity thisActivity = getActivity();
            if (thisActivity != null) {
                startActivity(new Intent(thisActivity, yourActivity.class)); // if needed
                thisActivity.finish();
            }
Sam Byte
quelle
0

15. Juni 2020 - Aktualisierte Antwort.

Sie haben zwei Möglichkeiten für Java und Kotlin. Die Logik beider Wege ist jedoch gleich. Sie sollten die Aktivität nach der Methode finish () aufrufen .

Antwort für Kotlin ,

Wenn Ihre Aktivität nicht null sein kann, verwenden Sie Answer_1 . Wenn Ihre Aktivität jedoch null sein kann , verwenden Sie Answer_2 .

Answer_1: activity!!.finish()
Answer_2: activity?.finish()

Antwort für Java,

getActivity().finish();

@canerkaseler

canerkaseler
quelle
-1

versuche dies zu benutzen

ja Fragment.classimplementiert nichtfinish()

Verwenden Sie immer, wenn Sie mit Fragmenten arbeiten, anstatt diese zu verwenden oder auf den Kontext zu verweisen getActivity(). Sie sollten anrufen

Rahul Goswami
quelle
11
Sagen Sie mir den Unterschied zwischen Ihrer Antwort und der ersten Antwort oben (von @ coder_For_Life22) ...
Filipe Brito
Keine Falle
Demotiviert am