Intenté cerrar el fragmento actual usando Imagebutton.
Estoy en el Fragmento-A y se convertirá en el Fragmento-B cuando haga clic en el botón.
Y cuando hago clic en el botón en Fragmento-B, cambiará al Fragmento-C y cerrará el Fragmento-B.
Si hago clic en el botón Atrás en Fragmento-C, volverá al Fragmento-A.
El código que he probado es como el siguiente
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();
}
Cuando hago clic en el botón Atrás en el fragmento B, se convierte en el Fragmento-C.
Pero cuando hago clic en el botón Atrás en Fragmento-C, no vuelve al Fragmento-A. Vuelve al fondo vacío. Si quiero volver al Fragmento-A, tengo que hacer clic en el botón Atrás una vez más.
Entonces, parece que no cierra el fragmento actual por completo.
¿Cómo terminar el fragmento actual como el botón de retroceso de Android?
MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)
? debe agregar el fragmento a backstak y hacer estallar el mismo en consecuenciaRespuestas:
Desde el Fragmento A, para ir a B, reemplace A con B y use
addToBackstack()
antescommit()
.Ahora, desde el Fragmento B, para ir a C, primer uso
popBackStackImmediate()
, esto traerá de vuelta A. Ahora reemplace A con C, al igual que la primera transacción.fuente
Cambio el código de
getActivity().getFragmentManager().beginTransaction().remove(this).commit();
a
getActivity().getFragmentManager().popBackStack();
Y puede cerrar el fragmento.
fuente
Para aquellos que necesitan descubrir una forma sencilla
Tratar
getActivity().onBackPressed();
fuente
popBackStack()
ypopBackStackImmediate()
son formas más directas de hacer estallar el fragmento superior sin simular la presión de un botón. UsandoonBackPressed()
disparadoresOnBackPressedCallback
s; Si en el futuro desea manejar específicamente las pulsaciones del botón Atrás, tendrá que cambiar apopBackStack()
/popBackStackImmediate()
para evitar activar las devoluciones de llamada mediante programación.getActivity().onBackPressed
hace todo lo que necesita. Llama automáticamente al método onBackPressed en la actividad principal.fuente
Prueba esto:
ft.addToBackStack(null); // ft is FragmentTransaction
Entonces, cuando presiona la tecla de retroceso , la actividad actual (que contiene múltiples fragmentos) cargará el fragmento anterior en lugar de terminar por sí misma.
fuente
Puedes probar esta lógica porque me funcionó.
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(); }
fuente
Esta es una forma de Kotlin de hacer esto, he creado un botón en el diseño de fragmentos y luego configuré onClickListner en onViewCreated.
override fun onViewCreated(view: View?, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) btn_FragSP_back.setOnClickListener { activity?.onBackPressed() } }
fuente
Prueba esto:
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(); }
fuente
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(); } });
fuente
Si necesita manejar la acción de manera más específica con el botón de retroceso, puede usar el siguiente método:
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; } } });
fuente
En sus Fragmentos
onCreateView(...)
, puede eliminar una vista llamandocontainer.removeView(view);
. Entonces, si desea eliminar el fragmento, entoncesview
debería ser el valor de retorno deonCreateView
,por ejemplo
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; }
fuente
Prueba este
getActivity().finish();
fuente