El método addToBackStack () no funciona sin reemplazar el método onBackPressed () en android

Aquí está el código de MainActivity que he escrito. Estoy cargando la lista de fragmentos en la primera pantalla. Cuando el usuario teclea cualquiera de los elementos de la lista, el nombre del planeta se mostrará al usuario en el fragmento de detalle que he definido en una clase separada.

Estoy agregando la transacción de "Lista de Planeta de Fragmento" -> "Fragment Planet Detail" a la pila trasera. Así que lo que espero es cuando presiono el botón de atrás del fragmento de detalle del planeta, debe cargar la lista de planeta en el teléfono. Pero no está sucediendo de esta manera.

import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.support.v7.app.ActionBarActivity; import android.view.Menu; import android.view.MenuItem; import android.widget.FrameLayout; import com.meditab.fragments.fragment.FragmentPlanetDetail; import com.meditab.fragments.fragment.FragmentPlanetList; import java.util.ArrayList; import java.util.List; public class MainActivity extends ActionBarActivity implements Callback { private FrameLayout frmPlanetList; private FrameLayout frmPlanetDetail; private boolean isPhone; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); frmPlanetList = (FrameLayout) findViewById(R.id.frmPlanetList); frmPlanetDetail = (FrameLayout) findViewById(R.id.frmPlanetDetail); if (null != frmPlanetDetail) { isPhone = false; } else { isPhone = true; } FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.frmPlanetList, new FragmentPlanetList()); fragmentTransaction.commit(); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } @Override public void onListItemClicked(int intPosition) { FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); List<String> lstPlanetArray = getPlanetArray(); String strPlanetName = lstPlanetArray.get(intPosition); FragmentPlanetDetail fragmentPlanetDetail = FragmentPlanetDetail.newInstance(strPlanetName); if (isPhone) { fragmentTransaction.addToBackStack(null); fragmentTransaction.replace(R.id.frmPlanetList, fragmentPlanetDetail); } else { fragmentTransaction.replace(R.id.frmPlanetDetail, fragmentPlanetDetail); } fragmentTransaction.commit(); } private List<String> getPlanetArray() { List<String> lstPlanets = new ArrayList<>(10); lstPlanets.add("Mercury"); lstPlanets.add("Venus"); lstPlanets.add("Earth"); lstPlanets.add("Mars"); lstPlanets.add("Jupiter"); lstPlanets.add("Saturn"); lstPlanets.add("Uranus"); lstPlanets.add("Neptune"); lstPlanets.add("Saturn"); return lstPlanets; } } 

Sin embargo, si reemplazo el método backPress y pop la pila trasera de forma programática, funciona muy bien.

 @Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() != 0) { getFragmentManager().popBackStack(); } else { super.onBackPressed(); } } 

¿Necesito anular el método onBackPressed () de esta manera si quiero lograr este comportamiento? No está documentado que necesite anular este método en este vínculo. Android Back Press Fragmento Documentación

Clase del detalle del planeta del fragmento

 import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.meditab.fragments.R; /** * Created by BHARGAV on 25-Dec-14. */ public class FragmentPlanetDetail extends Fragment { private String strPlanetName; public FragmentPlanetDetail() { } public static FragmentPlanetDetail newInstance(String strPlanetName) { FragmentPlanetDetail fragmentPlanetDetail = new FragmentPlanetDetail(); Bundle bundle = new Bundle(); bundle.putString("Planet_Name", strPlanetName); fragmentPlanetDetail.setArguments(bundle); return fragmentPlanetDetail; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getArguments(); if (null != bundle) { strPlanetName = bundle.getString("Planet_Name"); } } @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.planet_name, container, false); TextView txtPlanetName = (TextView) rootView.findViewById(R.id.txtPlanetName); txtPlanetName.setText(strPlanetName); return rootView; } } 

Fragmento Planeta Lista Clase:

 import android.app.Activity; import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import com.meditab.fragments.Callback; import com.meditab.fragments.R; import java.util.ArrayList; import java.util.List; /** * Created by BHARGAV on 25-Dec-14. */ public class FragmentPlanetList extends Fragment { private ListView listView; private ArrayAdapter<String> stringArrayAdapter; private Callback callback; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View rootView = inflater.inflate(R.layout.listview, container, false); listView = (ListView) rootView.findViewById(R.id.listView); stringArrayAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, getPlanetArray()); listView.setAdapter(stringArrayAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { callback.onListItemClicked(position); } }); return rootView; } @Override public void onAttach(Activity activity) { super.onAttach(activity); callback = (Callback) activity; } private List<String> getPlanetArray() { List<String> lstPlanets = new ArrayList<>(5); lstPlanets.add("Mercury"); lstPlanets.add("Venus"); lstPlanets.add("Earth"); lstPlanets.add("Mars"); lstPlanets.add("Jupiter"); lstPlanets.add("Saturn"); lstPlanets.add("Uranus"); lstPlanets.add("Neptune"); lstPlanets.add("Saturn"); return lstPlanets; } } 

Interfaz de devolución de llamada:

 /** * Created by BHARGAV on 26-Dec-14. */ public interface Callback { public void onListItemClicked(int intPosition); } 

Gracias. Por favor, hágamelo saber si se necesita algún detalle o código adicional.

5 Solutions collect form web for “El método addToBackStack () no funciona sin reemplazar el método onBackPressed () en android”

De acuerdo. Por lo tanto, la razón por la que no está funcionando es el conflicto de ActionBarActivty y las diferencias de clase Activity. Y el differnce entre getSupportFragmentManager () y getFragmentManager () los métodos de FragmentTransaction .

ActionBarActivity:

Yo estaba usando ActionBarActivity que es android.support.v7.app.ActionBarActivity . Esto significa que estaba usando la biblioteca v7 compat

FragmentManager: Fragment Manager no eran de la biblioteca compat. Fue directamente

 import android.app.FragmentManager; import android.app.FragmentTransaction; 

como se puede ver en la clase MainActivity.

Fragmento: android.app.Fragment ; es la clase que se importa en las clases de fragmentos por separado.

Tan una vez que cambié de ActionBarActivity a la clase de la actividad, las cosas estaban trabajando muy bien. Lo mismo ocurre cuando cambié las clases FragmentManager, FragmentTransaction y Fragment para dar soporte a clases de biblioteca.

Así que después de cualquier modificación, las cosas empezaron a funcionar normalmente. Gracias.

Por supuesto, no es necesario anular el método onBackPressed() . Es sólo un hack.

Esta condición la estropea.

 if (isPhone) { fragmentTransaction.addToBackStack(null); 

¿por qué no utiliza esta declaración sin condición una vez para ver si funciona. Puedes guardar el resto como es. Simplemente mueva esta declaración fuera de la condición if.

Wierd, pero creo que

 addToBackStack(null) 

es el problema

Pruebe a reemplazarlo con

 addToBackStack("planetDetail"); 

Está utilizando la actividad barra de acción que extiende la actividad de fragmentos. Ahora, para tener un comportamiento perfecto, necesita fragmentos de soporte para trabajar con la actividad de barra de acción.

Aquí está usando la actividad de la barra de acción con fragmentos normales (no es compatible con los fragmentos v4) y eso es lo que está causando el problema. Así que para tener un comportamiento perfecto, cambiar sus fragmentos para apoyar fragmentos y debe funcionar bien.

Déjame saber si eso no funciona.

Bueno, yo estaba teniendo el mismo problema con usted. Lo que funcionó para mí y creo que es la solución para usted también es cambiar el:

1. fragmento con el fragmento de la biblioteca de soporte:

 import android.support.v4.app.Fragment; 

y

  1. getFragmentManager () con el método getSupportFragmentManager ():
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.