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?


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.


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.


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


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.


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

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ę.


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

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

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

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

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

-7

Spróbuj tego

getActivity().finish();

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.