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:
- Comportamiento diferente de la clase StringBuffer en Java y Android
- Ajuste el botón Visible en otro acticty con la configuración de Preferencias
- Android Studio v7- Errores de importación para pocas clases (No se puede resolver el símbolo)
- SearchView no filtrar en cada niño Tab de TabLayout
- vuforia AR SDK - no se puede reproducir video por url
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?
- Compruebe si el valor entero ha aumentado?
- Android cómo leer varias características BLE con un PriorityQueue
- Redireccionamiento de STDIN y STDOUT del programa C en Android
- Facebook Connect Android - usando stream.publish @ http://api.facebook.com/restserver.php
- Cómo llamar a las actividades de un hilo no actividad?
- ¿Por qué tengo un error cuando intento anular un enlace genérico con Guice? (TypeLiteral)
- Observable OnCompleted no puede actualizar la interfaz de usuario
- Cámara Android: ¿Hilos? Que debe hacer lo que
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.
- Archivo de diseño Android eliminado accidentalmente
- Uso de android.view.SurfaceView con una cámara en parte de la pantalla