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?
MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)
??. musisz dodać fragment do backstak i odpowiednio wbić to samoOdpowiedzi:
Z Fragmentu A, aby przejść do B, zamień A na B i użyj
addToBackstack()
wcześniejcommit()
.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.źródło
Zmieniam kod z
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
do
getActivity().getFragmentManager().popBackStack();
I może zamknąć fragment.
źródło
Dla tych, którzy chcą znaleźć prosty sposób
Próbować
getActivity().onBackPressed();
źródło
popBackStack()
ipopBackStackImmediate()
są bardziej bezpośrednimi sposobami otwierania najwyższego fragmentu bez symulowania naciśnięcia przycisku. Korzystanie zonBackPressed()
wyzwalaczyOnBackPressedCallback
; jeśli w przyszłości będziesz chciał obsługiwać konkretnie naciśnięcia przycisku Wstecz, będziesz musiał przełączyć się napopBackStack()
/,popBackStackImmediate()
aby uniknąć programowego wyzwalania wywołań zwrotnych.getActivity().onBackPressed
robi wszystko, czego potrzebujesz. Automatycznie wywołuje metodę onBackPressed w działaniu rodzica.źródło
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.
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) btn_FragSP_back.setOnClickListener { activity?.onBackPressed() } }
źródło
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ę.
źródło
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(); }
źródło
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(); }
źródło
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(); } });
źródło
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; } } });
źródło
W swoich fragmentach
onCreateView(...)
możesz usunąć widok, dzwoniąccontainer.removeView(view);
. Więc jeśli chcesz usunąć fragment, toview
powinna 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; }
źródło
Spróbuj tego
getActivity().finish();
źródło