Jak zamknąć bieżący fragment za pomocą przycisku jak przycisku Wstecz?

86

Próbowałem zamknąć bieżący fragment za pomocą przycisku Imagebutton.

Jestem we fragmencie-A i po kliknięciu przycisku zmieni się na fragment-B.

A kiedy kliknę przycisk na Fragment-B, przejdzie do Fragment-C i zamknie Fragment-B.

Jeśli kliknę przycisk Wstecz na Fragment-C, wróci do Fragmentu-A.

Kod, który wypróbowałem, wygląda następująco

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

Kiedy klikam przycisk Wstecz we fragmencie-B, zmienia się na Fragment-C.

Ale kiedy klikam przycisk Wstecz na Fragment-C, nie powraca do Fragment-A. To z powrotem na puste tło. Jeśli chcę wrócić do Fragmentu-A, muszę ponownie kliknąć przycisk Wstecz.

WIĘC, wygląda na to, że bieżący fragment nie jest kompletny.

Jak zakończyć obecny fragment, jak przycisk Wstecz w Androidzie?

Wun
źródło
Co to jest MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??. musisz dodać fragment do backstak i odpowiednio wbić to samo
Raghunandan
Tam dodano fragment w funkcji addFragment.
Niedziela
dodać fragment do czego i sposób działania ??
Raghunandan
2
getActivity (). onBackPressed (); może to zrobić
Viswanath Lekshmanan

Odpowiedzi:

82

Z Fragmentu A, aby przejść do B, zamień A na B i użyj addToBackstack()wcześniej commit().

Teraz z fragmentu B, aby przejść do C, pierwsze użycie popBackStackImmediate()spowoduje przywrócenie A. Teraz zamień A na C, tak jak w pierwszej transakcji.

SD
źródło
4
for usinf popStackImmediate (): -> getView (). setOnKeyListener (new View.OnKeyListener () {@Override public boolean onKey (View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity ()) .getSupportFragmentManager (). popBackStackImmediate (); return true;} return false;}});
Yash Agrawal
131

Zmieniam kod z getActivity().getFragmentManager().beginTransaction().remove(this).commit();

do

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

I może zamknąć fragment.

Wun
źródło
35
getActivity (). onBackPressed (); Myślę, że zrobi to, co wyjaśniłeś.
Viswanath Lekshmanan
4
@ suomi35 no. Kiedy potrzebujesz nadpisania onBackPressed (), napotkasz problemy z taką realizacją
Le_Enot
Nie wydaje się działać. w 2016 do setNavigationOnClickListener nie działa.
1
@ViswanathLekshmanan Myślę, że to powinna być odpowiedź zamiast komentarza. I w dodatku zaakceptowana odpowiedź.
Francisco Romero
1
To również zamyka Aktywność! Wymagane jest tylko zamknięcie fragmentu.
Zon
70

Dla tych, którzy chcą znaleźć prosty sposób

Próbować getActivity().onBackPressed();

Viswanath Lekshmanan
źródło
getActivity () może mieć wartość null wiele razy.
Arpit J.
1
@ArpitJ. przed wywołaniem onAttach () ma wartość null, fragment nie może istnieć bez aktywności.
Tamim Attafi
@TamimAttafi Prawda, ale odnosiłem się do przypadków takich jak obrót lub aktywność zakończona iz jakiegoś powodu fragment fragmentu nadal tam jest, wtedy zwróci wartość null.
Arpit J.
popBackStack()i popBackStackImmediate()są bardziej bezpośrednimi sposobami otwierania najwyższego fragmentu bez symulowania naciśnięcia przycisku. Korzystanie z onBackPressed()wyzwalaczy OnBackPressedCallback; jeśli w przyszłości będziesz chciał obsługiwać konkretnie naciśnięcia przycisku Wstecz, będziesz musiał przełączyć się na popBackStack()/, popBackStackImmediate()aby uniknąć programowego wyzwalania wywołań zwrotnych.
Nolan Amy
Umieszczasz ten kod wewnątrz metody onclick przycisków fragmentu.
Anon
6

getActivity().onBackPressedrobi wszystko, czego potrzebujesz. Automatycznie wywołuje metodę onBackPressed w działaniu rodzica.

Farruh Habibullaev
źródło
5

To jest sposób na zrobienie tego przez Kotlin, utworzyłem przycisk w układzie fragmentów, a następnie ustawiłem onClickListner w onViewCreated.

zgodnie z komentarzem @ Viswanath-Lekshmanan

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

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}
Abdul Rehman
źródło
to zamyka działanie, a nie fragment
nibbana
4

Spróbuj tego:

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

Tak więc, po naciśnięciu klawisza wstecznego , bieżąca czynność (która zawiera wiele fragmentów) załaduje poprzedni fragment, a nie zakończy się.

Shailendra Madda
źródło
4

Spróbuj tego:

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();
}
Żaden
źródło
4

Możesz wypróbować tę logikę, ponieważ działa dla mnie.

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
źródło
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.
źródło
3
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
rollstuhlfahrer
Ten prosty kod w rzeczywistości usuwa bieżący widok fragmentu za pomocą przycisku OK lub Zamknij. Używam go do wychodzenia z panelu ustawień światła wyświetlanego jako Fragment i wracam do Aktywności. Przepraszam za tę sztuczkę, ale myślę, że w systemie Android 8 zarządzanie wieloma fragmentami nie jest tak praktyczne.
Bruno L.
1

Jeśli potrzebujesz bardziej szczegółowo obsłużyć akcję za pomocą przycisku Wstecz, możesz użyć następującej metody:

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
źródło
0

W swoich fragmentach onCreateView(...)możesz usunąć widok, dzwoniąc container.removeView(view);. Więc jeśli chcesz usunąć fragment, to viewpowinna być zwracana wartośćonCreateView ,

na przykład

    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
źródło
-7

Spróbuj tego

getActivity().finish();
Karan Chunara
źródło
1
Spróbuj dokładniej wyjaśnić swoją odpowiedź, aby OP i inne osoby mogły z łatwością zrozumieć odpowiedź, która wróci do tego pytania w przyszłości
Aman Chhabra
7
to zamyka całą działalność, a nie fragment
busuu
Pomogło mi. Ci, którzy chcą więcej informacji, mogą to wygooglować. Nie ma potrzeby kopiowania tutaj oficjalnej dokumentacji.
Alesha170
Jeśli używasz BottomNavigationView, który zwykle ma jedno działanie, to polecenie zamknie aplikację, zamiast wracać do poprzedniego fragmentu.
Aliton Oliveira