Tengo una actividad con un fragmento animado. Cuando se presiona sobre backpressed para cerrar la actividad me sale este error. ¿Qué significa esto?

  01-24 12:41:24.407: E/AndroidRuntime(23621):    FATAL EXCEPTION: main
01-24 12:41:24.407: E/AndroidRuntime(23621):     java.lang.IllegalStateException: Activity has been destroyed
01-24 12:41:24.407: E/AndroidRuntime(23621):   at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1351)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at android.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at android.app.BackStackRecord.commit(BackStackRecord.java:574)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at com.eni.enim4s.TranslucentActivity$1.run(TranslucentActivity.java:70)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at android.os.Handler.handleCallback(Handler.java:725)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at android.os.Handler.dispatchMessage(Handler.java:92)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at android.os.Looper.loop(Looper.java:176)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at android.app.ActivityThread.main(ActivityThread.java:5279)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at java.lang.reflect.Method.invokeNative(Native Method)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at java.lang.reflect.Method.invoke(Method.java:511)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
01-24 12:41:24.407: E/AndroidRuntime(23621):   at dalvik.system.NativeStart.main(Native Method)

Mi código:

  public class TranslucentActivity extends Activity {
private Fragment fragment;
private FrameLayout frame;
private android.app.FragmentTransaction ft;
private android.app.FragmentManager fragmentManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
//TODO Auto-generated method stub
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.translucent);
frame =(FrameLayout)findViewById(R.id.container);
}
@Override
public void onWindowFocusChanged(boolean hasFocus) {
//TODO Auto-generated method stub
super.onWindowFocusChanged(hasFocus);
frame.postDelayed(new Runnable() {
@Override
public void run() {
//TODO Auto-generated method stub
fragment = new ViewDetail();
fragmentManager = getFragmentManager(); 
ft = fragmentManager.beginTransaction(); 
ft.setCustomAnimations(R.animator.trans_left_in,R.animator.trans_left_out);
ft.addToBackStack(null); 
ft.replace(R.id.container, fragment, "Dettaglio"); 
ft.commit();//the error is here
}
}, 500);
}
@Override
public void onBackPressed() {
super.onBackPressed();
this.finish();
}

}

  • ¿Por qué mantener la //TODO Auto-generated method stub texto de Eclipse en el código?

3 Comentarios

  1. 2

    usted puede simplemente eliminar este onBackPressed como android implícitamente termina la actividad en la parte de atrás tecla pulsada.

    Y no llamar addToBackStack:

    ft.addToBackStack(null); 

    quitar la línea anterior esto se suma su fragmento de transacciones en backstack y en la parte de atrás tecla pulsada primera operación, se revierte y luego de que finalice la actividad.

    Si se quita esta atrás pulse finalizar la actividad.

    cambiar a:

        if(hasFocus){
    frame.postDelayed(new Runnable() {
    @Override
    public void run() {
    //TODO Auto-generated method stub
    fragment = new ViewDetail();
    fragmentManager = getFragmentManager(); 
    ft = fragmentManager.beginTransaction(); 
    ft.setCustomAnimations(R.animator.trans_left_in,R.animator.trans_left_out);
    ft.addToBackStack(null); 
    ft.replace(R.id.container, fragment, "Dettaglio"); 
    ft.commit();//the error is here
    }
    }, 500);
    }
    • Me sale el mismo error
    • ha retirado su aplicación de onBackPressed?
    • Sí, he quitado onBackPressed()
    • estás pulsando de nuevo el botón antes de 500ms??
    • Incluso después de que ocurre lo mismo
    • la cosa es onFocus cambio se denomina incluso cuando usted se muda fuera de la ventana para que sólo verifique si la ventana está el enfoque y, a continuación, llamar post retraso
    • Ahora trabajo, muchas gracias
    • Todavía habrá que tirar si uno presiona el botón atrás justo después de llegar de enfoque…
    • para manejar este caso. Reemplazar el onBackKeyPress y establecer un valor booleano que de nuevo se ha pulsado la tecla, y en el método run de la post retraso en primer lugar comprobar si la espalda no se oprime ninguna tecla y, a continuación, agregar solo un fragmento.

  2. 4

    El error no está sucediendo en la línea

    this.finish();//the error is here

    es más probable que ocurra en

    ft.commit();

    Lo que pasa es que, cuando aparece este error, este código se ejecuta después de la actividad ha sido destruida, por lo que no hay FragmentManager o cualquier Activity estado para trabajar, por lo tanto la transacción no puede ser comprometido.

    Esto sucede debido a que este código se ejecuta después de un retraso, y si se pulsa de nuevo el foco de la ventana de los cambios y la tarea puede ser programada, pero la actividad es destruido antes de que la tarea en realidad comienza.

    Lo que usted podría hacer es agregar un if (!isFinishing()) comprobar antes de ejecutar la interfaz de usuario los cambios dentro de la tarea, pero yo le aconsejaría que se vuelva a pensar en su flujo de interfaz de usuario un poco. Si desea que la transacción se ejecute después de un retraso, pero antes de que la aplicación de los acabados, a continuación, mueva el finish() instrucción para el final de la tarea del run() (si esta es la interfaz de usuario sabio una buena experiencia de usuario o no).

    Nota también de que usted no debería tener que hacer tanto

    super.onBackPressed();
    this.finish();//the error is here

    en onBackPressed(): ya sea que usted haga alguna acción personalizada (por ejemplo, el acabado de la aplicación) para reemplazar el comportamiento predeterminado, o de salir a la original (super) de la conducta.

    • He quitado el método onBackPressed() pero me sale el mismo error. El error de comenzar en ft.commit
    • Sí, eso es lo que yo estoy diciendo en mi respuesta, lea una vez más 😉 Incluso si usted retira su onBackPressed(), el valor predeterminado onBackPressed() comportamiento se ejecutará cuando se pulse el botón atrás y que por lo general termina el Activity que significaría que su ventana pierde el foco y onWindowFocusChanged() se llama de todos modos. De nuevo, mirar las soluciones que propuso y entender por qué está pasando (es porque estás haciendo de interfaz de usuario de trabajo después la actividad ha sido destruido).
    • El !isFinishing() trabajó para mí, gracias por la buena explicación así!
    • Hacer isFinishing() devolver true si la actividad se ya ha terminado?
  3. -1
    @Override
    public void onBackPressed() {
    super.onBackPressed() 
    }

    Quitar esta línea this.finish() ;

    realidad super.onBackPressed() finalizar su actividad

    • super.onBackPressed() eliminar único fragmento de animación en la actividad, no la actividad. Hay un error en ft.commit() en el método de ejecutar()

Dejar respuesta

Please enter your comment!
Please enter your name here