Fragmento presionando el botón Atrás

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

    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 f = fragmentManager.getFragments(); Fragment frag = f.get(0); currentFragment = frag.getClass().getSimpleName(); } }); 

    (Además, agregando mi fragmenManager se declara global) Ahora cada vez que cambie el 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 de retroceso 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í.

    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

    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.

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

    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 stack posterior para que esto funcione

    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

    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.

    Puede usar getFragmentManager().popBackStack() en el Fragment básico para volver atrás.

    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) 🙂 😉

    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

    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.

    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.