OnBackStackChanged () se llama dos veces cuando se agrega nuevo fragmento en backstack

Por lo tanto, tengo aviso problema interesante. Cuando agrego el nuevo fragmento programmatically, el método onBackStackChanged de OnBackStackChangedListener se llama dos veces, pero debe ser llamada solamente una vez. Aquí está mi código de actividad:

import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity implements FragmentManager.OnBackStackChangedListener{ private FragmentManager fragmentManager; private Button button1; private Button button2; private Button button3; private Fragment defaultFragment; private Fragment previousFragment; private Fragment currentFragment; private String currentFragmentTag; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button); button2 = (Button) findViewById(R.id.button2); button3 = (Button) findViewById(R.id.button3); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment(new FragmentOne(), FragmentOne.TAG); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment(new FragmentTwo(), FragmentTwo.TAG); } }); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showFragment(new FragmentThree(), FragmentThree.TAG); } }); setupFragmentManager(); } private void setupFragmentManager() { fragmentManager = getSupportFragmentManager(); fragmentManager.addOnBackStackChangedListener(this); FragmentOne fragmentOne = new FragmentOne(); defaultFragment = fragmentOne; // fragment for default currentFragmentTag = FragmentOne.TAG; currentFragment = fragmentOne; fragmentManager.beginTransaction() .add(R.id.fragments_container, currentFragment, currentFragmentTag) .addToBackStack(currentFragmentTag) .commit(); } public void showFragment(Fragment fragment, String fragmentTag) { previousFragment = currentFragment; currentFragment = fragment; fragmentManager.beginTransaction() .hide(previousFragment) .add(R.id.fragments_container, fragment, fragmentTag) .addToBackStack(fragmentTag) .commit(); } @Override public void onBackStackChanged() { Log.d("MY_TAG" , "onBackStackChangedListener - " + fragmentManager.getBackStackEntryCount() ); if (fragmentManager.getBackStackEntryCount() > 0) { String fragmentTag = fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount() - 1).getName(); currentFragment = fragmentManager.findFragmentByTag(fragmentTag); } else { currentFragment = defaultFragment; } // some code... } @Override public void onBackPressed() { if (fragmentManager.getBackStackEntryCount() == 1) { finish(); } else { super.onBackPressed(); } } } 

Y fragmento de clase:

 public class FragmentOne extends Fragment { public static final String TAG = FragmentOne.class.getSimpleName(); private Context context; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { context = getActivity(); View topLevelView = LayoutInflater.from(context).inflate(R.layout.fragment_layout, container, false); TextView textView = (TextView) topLevelView.findViewById(R.id.fragment_Text); textView.setText("This is FRAGMENT ONE"); return topLevelView; } } 

FragmentTwo y FragmentThree son idénticos a FragmentOne.

Y cuando inicio mi aplicación, en log veo:

 onBackStackChangedListener - 1 onBackStackChangedListener - 1 

Después de pulsar el botón (muestre el siguiente fragmento) veo:

 onBackStackChangedListener - 2 onBackStackChangedListener - 2 

y otro:

 onBackStackChangedListener - 3 onBackStackChangedListener - 3 

Y cambiando

 .add(R.id.fragments_container, currentFragment, currentFragmentTag) 

a

 .replace(R.id.fragments_container, currentFragment, currentFragmentTag) 

No resuelve el problema.

Pero es muy extraño. ¿Por qué mi OnBackStackChangedListener llama más de una vez propio método después de agregar el fragmento?

No podía creer que pudiera suceder. Creó un proyecto similar y se metió en el depurador. Resulta que es un error en la nueva biblioteca de soporte. Hay un error abierto en el rastreador .

Cambiar de nuevo a 25.0.0 funcionará como esperado.

 compile 'com.android.support:appcompat-v7:25.0.0' compile 'com.android.support:support-v4:25.0.0' 

Aunque no se menciona en notas de lanzamiento , pero se menciona en el rastreador de incidencias , que el problema se fija en 25.4.0 , lo cual es bueno 😊.

Sólo una actualización. Google finalmente lanzó la versión 25.4.0 con ese problema resuelto.

Solamente, ahora la materia de la ayuda se piensa para ser cogida del repositorio de Maven de Google:

 maven { url 'https://maven.google.com' } 

Así que puedes empezar a usar las nuevas versiones de todo y desinstalar el repositorio de soporte local del SDK Manager.

  • ¿Está bien tener una instancia de SQLiteOpenHelper compartida por todas las actividades en una aplicación de Android?
  • Reproducir / grabar archivos .DSS o .DS2
  • Cómo realizar varias operaciones con JSch
  • La referencia de Facebook no está disponible para mi proyecto
  • Android: AndroidHttpClient - ¿cómo establecer el tiempo de espera?
  • Error de aserción (scn == 3 || scn == 4) en void cv :: cvtColor (cv :: InputArray Android
  • Configuración de Proguard para Android Support v4 22.2.0
  • ¿Cómo utilizo un proyecto Java que requiere un nivel de cumplimiento de 1.7 en una ruta de construcción de proyecto de Android?
  • Android - FATAL EXCEPTION: main - No se puede iniciar la actividad ComponentInfo
  • Tabla de referencia local de JNI de Android Expand
  • ¿Cómo puedo generar un número aleatorio en un rango específico en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.