studio - implement fragment in android
Android FragmentTransaction commit ya llamado (6)
Está comenzando la FragmentTransaction fuera de OnItemClickListener
. Por lo tanto, intenta commit()
una FragmentTransaction única cada vez que el usuario hace clic en un elemento en su ListView.
Debe comenzar una nueva FragmentTransaction cada vez que tenga la intención de realizar cualquier cantidad de operaciones de Fragment.
Una solución simple se vería así:
f1_fragment = new F1_Fragments();
f2_fragment = new F2_Fragments();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();
parent.getItemAtPosition(position);
if(position==0){
fragmentTransaction.replace(android.R.id.content, f1_fragment);
}else{
fragmentTransaction.replace(android.R.id.content, f2_fragment);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
Mi error :
java.lang.IllegalStateException: commit ya llamado
Mi código:
final FragmentTransaction fragmentTransaction =getFragmentManager().beginTransaction();
f1_fragment = new F1_Fragments();
f2_fragment = new F2_Fragments();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
parent.getItemAtPosition(position);
if(position==0){
fragmentTransaction.replace(android.R.id.content, f1_fragment);
}else{
fragmentTransaction.replace(android.R.id.content, f2_fragment);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
El error
java.lang.IllegalStateException: commit ya llamado
muestra que FragmentTransaction
se ha completado después de invocar commit()
la primera vez y que está llamando de nuevo a commit()
que tiende a completarlo una vez más. Por lo tanto, crea un estado Ilegal para FragmentTransaction
.
Según su código, está utilizando la misma FragmentTransaction
para cambiar fragmentos. Sin embargo, después de la primera llamada commit()
, FragmentTransaction
ha completado y debe comenzar nuevamente para realizar cualquier operación en Fragments
.
Puede cambiar su ClickListner
como:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
fragmentTransaction = getSupportFragmentManager().beginTransaction();
parent.getItemAtPosition(position);
if(position==0){
fragmentTransaction.replace(android.R.id.content, f1_fragment);
}else{
fragmentTransaction.replace(android.R.id.content, f2_fragment);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}
});
Espero que aclare tu duda.
Resolví el problema después de llamar a commit()
y de nuevo reemplazar el fragmento desde el que debería comenzar
fragmentTransaction = fragmentManager.beginTransaction();
if(position==0){
fragmentTransaction.replace(android.R.id.content, f1_fragment);
else{
fragmentTransaction.replace(android.R.id.content, f2_fragment);
}
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
Tuve el mismo problema y lo he resuelto creando una nueva instancia de FragmentTransaction
.
Simplemente agregue cada vez debajo de la línea antes de agregar / reemplazar fragmento.
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Espero que esto te ayude.
Mira este escenario
Necesito agregar un nuevo fragmento en cada clic del elemento de la lista. Inicialice la transacción de fragmento en cada elemento, haga clic.
switch (v.getId()) {
case R.id.tvaddExpense:
fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.add(R.id.containerFucntionsList, new Fragment1());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
case R.id.relEvents:
fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.containerFucntionsList, new Fragment2());
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
break;
}
puedes usar este método para reemplazar el fragmento con solo llamar a esto
hacer esos son globales
YourFragment1 frg1 = new YourFragment1 ();
YourFragment2 frg1 = new YourFragment2 ();
Y luego llámalo por
openFragment(frg1);
o
openFragment(frg2);
OpenFragment:
private void openFragment(final Fragment fragment) {
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.container, fragment);
transaction.addToBackStack(null);
transaction.commit();
}