Wie schließe ich das aktuelle Fragment, indem ich die Schaltfläche wie die Zurück-Schaltfläche verwende?

84

Ich habe versucht, das aktuelle Fragment mit Imagebutton zu schließen.

Ich bin in Fragment-A und es wird zu Fragment-B, wenn ich auf die Schaltfläche klicke.

Und wenn ich bei Fragment-B auf die Schaltfläche klicke, wird es zu Fragment-C und schließt das Fragment-B.

Wenn ich bei Fragment-C auf die Schaltfläche Zurück klicke, wird wieder Fragment-A angezeigt.

Der Code, den ich ausprobiert habe, lautet wie folgt

camera_album = (ImageButton) view.findViewById(R.id.camera_album);

camera_album.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

                    closefragment();
        Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
        MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;


    }
});

private void closefragment() {
    getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}

Wenn ich bei Fragment-B auf die Schaltfläche "Zurück" klicke, wird "Fragment-C" angezeigt.

Wenn ich jedoch auf Fragment-C auf die Schaltfläche "Zurück" klicke, wird nicht auf "Fragment-A" zurückgegriffen. Es zurück zum leeren Hintergrund. Wenn ich zu Fragment-A zurückkehren möchte, muss ich erneut auf die Schaltfläche "Zurück" klicken.

Es scheint also, dass das aktuelle Fragment nicht vollständig geschlossen ist.

Wie beende ich das aktuelle Fragment wie den Zurück-Button von Android?

Wun
quelle
Was ist das MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)? Sie müssen das Fragment zu Backstak hinzufügen und es entsprechend
platzen lassen
Dort wurde das Fragment in der Funktion addFragment hinzugefügt.
Wun
Fragment zu was und einer Aktivitätsmethode hinzufügen?
Raghunandan
2
getActivity (). onBackPressed (); kann dies tun
Viswanath Lekshmanan

Antworten:

78

Um von Fragment A zu B zu gelangen, ersetzen Sie A durch B und verwenden Sie es addToBackstack()zuvor commit().

Wenn Sie nun von Fragment B zu C gehen und es zuerst verwenden popBackStackImmediate(), wird dies A zurückbringen. Ersetzen Sie nun A durch C, genau wie bei der ersten Transaktion.

SD
quelle
4
für usinf popStackImmediate (): -> getView (). setOnKeyListener (neuer View.OnKeyListener () {@Override public boolean onKey (Ansicht v, int keyCode, KeyEvent-Ereignis) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity () .getSupportFragmentManager (). popBackStackImmediate (); return true;} return false;}});
Yash Agrawal
129

Ich ändere den Code von getActivity().getFragmentManager().beginTransaction().remove(this).commit();

zu

getActivity().getFragmentManager().popBackStack();

Und es kann das Fragment schließen.

Wun
quelle
34
getActivity (). onBackPressed (); Dies wird das tun, was Sie erklärt haben.
Viswanath Lekshmanan
4
@ suomi35 nein. Wenn Sie onBackPressed () überschreiben müssen, werden Sie Probleme mit einer solchen Realisierung haben
Le_Enot
Scheint nicht zu funktionieren. 2016 funktioniert in setNavigationOnClickListener nicht.
1
@ ViswanathLekshmanan Ich denke, dies sollte eine Antwort anstelle eines Kommentars sein. Und die akzeptierte Antwort zusätzlich.
Francisco Romero
1
Es schließt auch die Aktivität! Es ist nur das Schließen von Fragmenten erforderlich.
Zon
68

Für diejenigen, die einen einfachen Weg finden müssen

Versuchen getActivity().onBackPressed();

Viswanath Lekshmanan
quelle
getActivity () kann oft null sein.
Arpit J.
1
@ArpitJ. Es ist nur null, bevor onAttach () aufgerufen wird. Ein Fragment kann ohne Aktivität nicht leben.
Tamim Attafi
@TamimAttafi Stimmt, aber ich bezog mich auf Fälle, in denen die Rotation oder Aktivität beendet ist und aus irgendeinem Grund die Fragmentinstanz immer noch vorhanden ist, wird sie null zurückgeben.
Arpit J.
popBackStack()und popBackStackImmediate()sind direktere Möglichkeiten, das oberste Fragment zu platzen, ohne einen Knopfdruck zu simulieren. Verwenden von onBackPressed()Triggern OnBackPressedCallbacks; Wenn Sie in Zukunft speziell das Drücken von Zurück-Tasten behandeln möchten, müssen Sie zu popBackStack()/ wechseln, um popBackStackImmediate()zu vermeiden, dass die Rückrufe programmgesteuert ausgelöst werden.
Nolan Amy
5

getActivity().onBackPressedtut alles was du brauchst. Es ruft automatisch die onBackPressed- Methode in der übergeordneten Aktivität auf.

Farruh Habibullaev
quelle
4

Versuche dies:

ft.addToBackStack(null);   // ft is FragmentTransaction

Wenn Sie also die Zurück-Taste drücken , lädt die aktuelle Aktivität (die mehrere Fragmente enthält) das vorherige Fragment, anstatt sich selbst zu beenden.

Shylendra Madda
quelle
4

Dies ist eine Kotlin-Methode. Ich habe eine Schaltfläche im Fragment-Layout erstellt und dann onClickListner in onViewCreated festgelegt.

laut @ Viswanath-Lekshmanan Kommentar

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) 
{
     super.onViewCreated(view, savedInstanceState)

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}
Abdul Rehman
quelle
3

Versuche dies:

public void removeFragment(Fragment fragment){
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
}
Keiner
quelle
3

Sie können diese Logik ausprobieren, weil sie für mich funktioniert.

frag_profile profile_fragment = new frag_profile();

boolean flag = false;
@SuppressLint("ResourceType")
public void profile_Frag(){
    if (flag == false) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1);
        transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment");
        transaction.commit();
        flag = true;
    }

}

@Override
public void onBackPressed() {
    if (flag == true) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.remove(profile_fragment);
        transaction.commit();
        flag = false;
    }
    else super.onBackPressed();
}
Rahul Rathore
quelle
3
Button ok= view.findViewById(R.id.btSettingOK);
Fragment me=this;
ok.setOnClickListener( new View.OnClickListener(){
    public void onClick(View v){
     getActivity().getFragmentManager().beginTransaction().remove(me).commit();
    }
});
Bruno L.
quelle
3
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Rollstuhlfahrer
Dieser einfache Code entfernt die aktuelle Fragmentansicht durch Klicken auf OK oder Schließen. Ich benutze es, um ein als Fragment angezeigtes Lichteinstellungsfeld zu verlassen und zur Aktivität zurückzukehren. Entschuldigung für diesen Trick, aber unter Android 8 ist es meiner Meinung nach nicht so praktisch, mehrere Fragmente zu verwalten.
Bruno L.
1

Wenn Sie die Aktion mit der Zurück-Schaltfläche genauer ausführen müssen, können Sie die folgende Methode verwenden:

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            onCloseFragment();
            return true;
        } else {
            return false;
        }
    }
});
Morteza Jalambadani
quelle
0

In Ihren Fragmenten können onCreateView(...)Sie eine Ansicht durch Aufrufen entfernen container.removeView(view);. Wenn Sie also das Fragment entfernen möchten, viewsollte der Rückgabewert von onCreateView, sein.

beispielsweise

    public View onCreateView(...){
        final View view = inflater.inflate(R.layout.your_fragments_layout,container,false);
        //Do something
        finishButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                container.removeView(view);
            }
        });
        return view;
    }
Ilmard
quelle
-5
getActivity().finish();

Dies ist der beste Weg, dies zu tun, da wir in einer Aktivität sind

getActivity()

Gibt die Aktivität an, in der sich das Fragment befand. Wenn Sie also die Funktion finish () für diese Aktivität aufrufen , können Sie das Fragment beenden.

N.Balgopal Patro
quelle
4
Dies schließt die Aktivität, nicht das Fragment
Jéwôm '
-6

Probier diese

getActivity().finish();
Karan Chunara
quelle
1
Versuchen Sie, Ihre Antwort genauer zu erklären, damit OP und andere Personen die Antwort, die in Zukunft auf diese Frage zurückkommt, leicht verstehen können
Aman Chhabra
5
Dies schließt die gesamte Aktivität, nicht das Fragment
Busuu
Es hat mir geholfen. Wer mehr Informationen möchte, kann diese googeln. Hier müssen keine offiziellen Unterlagen kopiert werden.
Alesha170
Wenn Sie BottomNavigationView verwenden, das normalerweise eine Aktivität enthält, wird mit diesem Befehl die App geschlossen, anstatt zum vorherigen Fragment zurückzukehren.
Aliton Oliveira