studio - regresar a un activity anterior android
Fragmento presionando el botón Atrás (14)
Ahora estoy teniendo una actividad que contiene fragmentos
[1], [2], [3], [4]
Si presiona los botones, [3], se puede redirigir a [4]
Me gustaría implementar el botón Atrás como se muestra a continuación.
cuando presiona hacia atrás en [4], vuelve a [3]
cuando presiona hacia atrás en [3], vuelve a [2]
al presionar nuevamente en [1], la actividad termina ();
Cuando se trata de la implementación actual, finaliza la actividad en lugar de mostrar el Fragmento. ¿Podría decirme qué debo hacer o tener en cuenta?
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if( keyCode==KeyEvent.KEYCODE_BACK)
{
finish();
}
return super.onKeyDown(keyCode, event);
}
Solución para presionar o manejar el botón Atrás en Fragment.
La forma en que resolví mi problema, estoy seguro de que te ayudará también:
1.Si no tienes ningún cuadro Editar texto en tu fragmento, puedes usar el siguiente código
Aquí MainHomeFragment es el Fragmento principal (cuando presiono el botón Atrás del segundo fragmento me llevará también MainHomeFragment)
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
fragmentTransaction.commit();
return true;
}
return false;
}
}); }
2. Si tiene otro fragmento llamado Somefragment y tiene Edit-text-box, puede hacerlo de esta manera.
private EditText editText;
Luego en,
onCreateView():
editText = (EditText) view.findViewById(R.id.editText);
A continuación, anule OnResume,
@Override
public void onResume() {
super.onResume();
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
editTextOFS.clearFocus();
getView().requestFocus();
}
return false;
}
});
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
MainHomeFragment mainHomeFragment = new SupplierHomeFragment();
android.support.v4.app.FragmentTransaction fragmentTransaction =
getActivity().getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, mainHomeFragment);
fragmentTransaction.commit();
return true;
}
return false;
}
});
}
Eso es todo amigos (amitamie.com) :-) ;-)
Asegúrese de agregar lo siguiente:
if (event.getAction()!=KeyEvent.ACTION_DOWN)
return true;
en el bloque de código onKey para evitar que el evento llame dos veces.
Bien chicos, finalmente descubrí una buena solución.
En su onCreate () en su actividad que alberga sus fragmentos, agregue un oyente de cambio de backstack de la siguiente manera:
fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
List<Fragment> f = fragmentManager.getFragments();
//List<Fragment> f only returns one value
Fragment frag = f.get(0);
currentFragment = frag.getClass().getSimpleName();
}
});
(También agrego mi fragmenManager se declara en las actividades O Ahora cada vez que cambias un fragmento, el fragmento actual String se convertirá en el nombre del fragmento actual. Luego, en las actividades enBackPressed () puedes controlar las acciones de tu botón Atrás así:
@Override
public void onBackPressed() {
switch (currentFragment) {
case "FragmentOne":
// your code here (Maybe dialog)
return;
case "FragmentTwo":
// your code here
return;
default:
fragmentManager.popBackStack();
// default action for any other fragment (return to previous)
}
}
Puedo confirmar que este método funciona para mí.
Esta es una solución de trabajo para mí:
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
// DO WHAT YOU WANT ON BACK PRESSED
return true;
}
return false;
}
});
Editar: puede reemplazar el diálogo con getView()
por fragmentos.
Esto funcionó para mí.
-Agrega .addToBackStack (null) cuando llamas al nuevo fragmento de la actividad.
FragmentTransaction mFragmentTransaction = getFragmentManager()
.beginTransaction();
....
mFragmentTransaction.addToBackStack(null);
-Añadir onBackPressed () a tu actividad
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() == 0) {
this.finish();
} else {
getFragmentManager().popBackStack();
}
}
La forma más fácil de la historia
onResume () :
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
// handle back button''s click listener
Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
Editar 1 : si el fragmento tiene EditText
.
private EditText editText;
onCreateView () :
editText = (EditText) rootView.findViewById(R.id.editText);
onResume () :
@Override
public void onResume() {
super.onResume();
editText.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
editText.clearFocus();
}
return false;
}
});
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
// handle back button''s click listener
Toast.makeText(getActivity(), "Back press", Toast.LENGTH_SHORT).show();
return true;
}
return false;
}
});
}
Nota: Funcionará si tiene EditText en fragmento.
Hecho
Lo que hago en estos casos es implementar la función onBackPressed () desde la Actividad:
@Override
public void onBackPressed() {
super.onBackPressed();
FragmentManager fm = getSupportFragmentManager();
MyFragment myFragment = (MyFragment) fm.findFragmentById(R.id.my_fragment);
if((myFragmen.isVisible()){
//Do what you want to do
}
}
Cómo funciona esto para ti también.
Prueba esta simple solución:
En tu actividad implementa onBackPressed
@Override
public void onBackPressed() {
if (getSupportFragmentManager().getBackStackEntryCount() > 1) {
getSupportFragmentManager().popBackStack();
} else {
finish();
}
}
Esto funcionará si quieres hacer estallar el fragmento superior en cada retroceso. Nota : - Mientras agrega fragmentos a la actividad, siempre agregue la transacción a la pila posterior para que esto funcione
Puede usar getFragmentManager().popBackStack()
en el Fragment
básico para volver atrás.
Puedes usar esto ... Funcionó para mí ...
Parece que el fragmento [3] no se elimina de la vista cuando se presiona atrás, ¡así que tienes que hacerlo manualmente!
En primer lugar, no use replace (), sino que use eliminar y agregar por separado. Parece que replace () no funciona correctamente.
La siguiente parte de esto está anulando el método onKeyDown y elimina el fragmento actual cada vez que se presiona el botón Atrás.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
{
if (keyCode == KeyEvent.KEYCODE_BACK)
{
if (getSupportFragmentManager().getBackStackEntryCount() == 0)
{
this.finish();
return false;
}
else
{
getSupportFragmentManager().popBackStack();
removeCurrentFragment();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
public void removeCurrentFragment()
{
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.f_id);
}
También debe verificar el evento Action_Down o Action_UP. Si no va a marcar, entonces el método OnKey () llamará 2 veces.
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
Toast.makeText(getActivity(), "Back Pressed", Toast.LENGTH_SHORT).show();
return true;
}
}
return false;
}
});
Trabajando muy bien para mi
Una solución aún mejor podría ser seguir un patrón de diseño de modo que el evento de presión del botón de retroceso se propague desde el fragmento activo hacia la actividad del host. Por lo tanto, es como ... si uno de los fragmentos activos consume la presión hacia atrás, la Actividad no actuará sobre él, y viceversa.
Una forma de hacerlo es hacer que todos sus Fragmentos extiendan un fragmento base que tiene un método abstracto booleano onBackPressed ().
@Override
public boolean onBackPressed() {
if(some_condition)
// Do something
return true; //Back press consumed.
} else {
// Back-press not consumed. Let Activity handle it
return false;
}
}
Mantenga un registro del fragmento activo dentro de su Actividad y dentro de él está activado Retrollamada regresiva presionada escriba algo como esto
@Override
public void onBackPressed() {
if(!activeFragment.onBackPressed())
super.onBackPressed();
}
}
Esta publicación tiene este patrón descrito en detalle
si está utilizando webview dentro de un fragmento, no use esto en su método onCreateView
webView.setOnKeyListener(new View.OnKeyListener(){
@Override
public boolean onKey(View view, int i, KeyEvent keyEvent) {
if((i==KeyEvent.KEYCODE_BACK)&& webView.canGoBack()){
webView.goBack();
return true;
}
return false;
}
});
e importar esta clase
import android.view.KeyEvent;
utilizo un método para cambiar fragmentos que tiene el siguiente código
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.anim.enter, R.anim.exit, R.anim.pop_enter, R.anim.pop_exit).replace(R.id.content_frame, mContent, mContent.getClass().getSimpleName()).addToBackStack(null)
.commit();
y para el botón Atrás esto.
@Override
public void onBackPressed() {
// note: you can also use ''getSupportFragmentManager()''
FragmentManager mgr = getSupportFragmentManager();
if (mgr.getBackStackEntryCount() == 1) {
// No backstack to pop, so calling super
finish();
} else {
mgr.popBackStack();
}
}
Lo importante a tener en cuenta es que uso 1 para verificar getBackStackEntryCount porque si no lo usa y usa 0 el usuario no ve nada en el último botón de retroceso.