tutorial studio navegar implement fragments example entre dinamicos android android-fragments fragmenttransaction

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