52

Tengo un fragmento;Obtuvo la excepción: fragmento ya activo

MyFragment myFrag = new MyFragment(); 

puse de datos de paquete a este fragmento:

Bundle bundle = new Bundle(); 
bundle.putString("TEST", "test"); 
myFrag.setArguments(bundle); 

Entonces, reemplazar fragmento de edad con éste y poner en backstack:

//replace old fragment 
fragmentTransaction.replace(R.id.fragment_placeholder, myFrag, "MyTag"); 
//put on backstack 
fragmentTransaction.addToBackStack(null); 
//commit & get transaction ID 
int transId = fragmentTransaction.commit(); 

tarde , I pop backstack con el ID por encima de la transacción (transId):

//pop the transaction from backstack 
fragmentManager.popBackStack(transId,FragmentManager.POP_BACK_STACK_INCLUSIVE); 

Más tarde, puse de datos de paquete como argumento nuevo para mi fragmento (myFrag):

//Got Java.lang.IllegalStateException: fragment already active 
myFrag.setArguments(bundle); 

Como se ve, mi código anterior se llevó excepción Java.lang.IllegalStateException: fragment already active. No entiendo por quémyFragsigue activo a pesar de que he reventado la transacción desde backstack., de todos modos, desde que llegué a excepción pensé que no tengo más remedio de-activa el fragmento, Por lo tanto, lo que hice:

Fragment activeFragment = fragMgr.findFragmentByTag("MyTag"); 
fragmentTransaction.remove(activeFragment); 

No estoy seguro de si mi código anterior puede realmente de-activa la fragmento, ya que no encontré cómo desactivar un fragmento. :(

Después de eso, cuando intento para establecer los datos de paquete a mi fragmento myFrag de nuevo, yo todavía tengo el mismo error:

Java.lang.IllegalStateException: fragment already active 

parece aún me quita el fragmento, que todavía está activo ... ¿Por Cómo de-activa un fragmento

+1

¿Es su fragmento un singleton? Muéstrame tu método newInstance() si tienes uno. – clauziere

+0

Espero que esto pueda ayudar a alguien. http://stackoverflow.com/a/15263921/541620 – theWook

+0

http://stackoverflow.com/a/15263921/541620 Espero que esto pueda ayudar a alguien. – theWook

Respuesta

1

Prueba a eliminar el fragmento anterior antes de añadir uno nuevo:?? https://stackoverflow.com/a/6266144/969325

+0

me trataron en primer lugar "fragmentTransaction.remove (myFrag)" y luego "replace (. ..)" , no ayuda. Obtuve la misma excepción –

+0

nono The PREVIOUS. entonces lo que está en la pila se elimina con remove y luego lo reemplazas con myfrag. – Warpzit

+0

'fragmentTransaction.remove (myFrag)' elimina el fragmento de su pila 'addedFragment' pero mantiene su instancia en su pila' activeFragment'. – DeltaCap

134

lectura de la fuente setArguments(Bundle args) ayudará a entender:

/** 
* Supply the construction arguments for this fragment. This can only 
* be called before the fragment has been attached to its activity; that 
* is, you should call it immediately after constructing the fragment. The 
* arguments supplied here will be retained across fragment destroy and 
* creation. 
*/ 
public void setArguments(Bundle args) { 

    if (mIndex >= 0) { 
     throw new IllegalStateException("Fragment already active"); 
    } 
    mArguments = args; 
} 

No puede utilizar setArguments(Bundle args) de nuevo en su código en el mismo Fragment. Supongo que lo que quiere hacer es crear un nuevoFragment y establecer los argumentos nuevamente. O puede usar getArguments() y luego usar el método put del paquete para cambiar sus valores.

+48

+1 para "puede usar getArguments() y luego usar los métodos put de bundle para cambiar sus valores". – Saran

+0

Aquí hay un buen ejemplo con la explicación detallada también. http://emuneee.com/blog/2013/01/07/saving-fragment-states/ – Hesam

+21

'getArguments(). putAll (bundle);' sobrescribirá todo el paquete – DeltaCap

1

remove() cambia el estado del fragmento a de-actiive. En su caso, simplemente no llamó a commit() después de eliminar (..).

fragmentTransaction.remove(activeFragment); 

usted haría commit() después remove(), también.

fragmentTransaction.remove(activeFragment).commit(); 
0

Tenía el mismo problema. Estaba agregando el fragmento a backstack. Y el error fue porque no llamé popbackstack(). Utilizar popbackstack me ayudó

0

Me encuentro con el mismo problema en Xamarin.android. Esto es lo que dice the documentation.

This can only be called before the fragment has been attached to its activity

0

Sólo tiene que llamar método público del fragmento

if(userFragment==null){ 
        userFragment = new UserFragment(); 
        Bundle bundle = new Bundle(); 
        bundle.putString(Constants.EXTRA_CUSTOMER, result); 
        userFragment.setArguments(bundle); 
       }else{ 
        try { 
         Customer customer = new Customer(); 
         customer.parseCustomer(new JSONObject(result)); 
         userFragment.updateVeiw(customer); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
0

Primero comienza con la descripción de por qué sucede esto y luego me van a llegar a la solución que encontré trabajando ....

Este problema ocurre cuando Android es retirar el fragmento de la pila, pero es todavía no terminó con la eliminación. Para verificar esto, puede usar el método isRemoving() del fragmento. Si false, es decir, el fragmento no está activo, puede continuar configurando los argumentos usando setArguments(bundle). De lo contrario, no puede establecer argumentos para un fragmento ya activo y solo puede anularlo dirigiendo los mismos argumentos usando getArguments().putAll(bundle).

En resumen,

if (myFrag.isRemoving()) { 
     myFrag.getArguments().putAll(bundle); 
    } else { 
     myFrag.setArguments(bundle); 
    } 

Si se quiere evitar esto, es decir, la eliminación del fragmento a la vez para que no haya fragmento activo, es posible que desee utilizar onBackPressed() en onBackStackChangedListener(), que permitirá establecer el isRemoving() a false .

+0

no funciona su solución. – abhishek

Cuestiones relacionadas