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.