18

me hizo una muy simple Actividad que muestra un simple ListFragment, como a continuación:código muy simple, pero ha obtenido un error "La actividad ha sido destruida" cuando el uso Fragmento

Mi Actividad:

public class MyActivity extends FragmentActivity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      FragmentManager fragMgr = getSupportFragmentManager(); 

      FirstFragment list = new FirstFragment(); 
      fragMgr.beginTransaction().add(android.R.id.content, list).commit(); 
    } 

} 

mi ListFragment:

public class FirstFragment extends ListFragment{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     inflater.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View view = inflater.inflate(R.layout.main, null); 
     return view; 
    } 


    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

     String listContent[] = {"Larry", "Moe", "Curly"}; 
     setListAdapter(new ArrayAdapter<String>(getActivity(), R.layout.list_item, listContent)); 
    } 
    ... 
} 

Cuando empiezo mi aplicación, tengo mensaje de error:

java.lang.IllegalStateException: Activity has been destroyed 
E/AndroidRuntime( 947): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
E/AndroidRuntime( 947): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
E/AndroidRuntime( 947): at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
E/AndroidRuntime( 947): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
E/AndroidRuntime( 947): at android.os.Handler.dispatchMessage(Handler.java:99) 
E/AndroidRuntime( 947): at android.os.Looper.loop(Looper.java:123) 
E/AndroidRuntime( 947): at android.app.ActivityThread.main(ActivityThread.java:4363) 
E/AndroidRuntime( 947): at java.lang.reflect.Method.invokeNative(Native Method) 
... 

Se queja de que La actividad ha sido destruida, Por qué ???

P.S. main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp"> 

    <Button 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="next" /> 

    <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#00FF00" 
    android:layout_weight="1" 
    android:drawSelectorOnTop="false" /> 

    <TextView 
    android:id="@android:id/empty" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="#FF0000" 
    android:text="No data" /> 
</LinearLayout> 

Respuesta

28

me di cuenta de mí mismo, es porque me perdí el super.onCreate(savedInstanceState); en mi método de Actividad onCreate(). Después de agregar esto, las cosas están bien.

+1

Tenga en cuenta que es posible que acepta su respuesta como la mejor respuesta –

+6

Si alguien puede explicar la razón profunda, aceptaré la mejor, no la mía :) –

+1

En mi caso estaba llamando a super.onCreate (savedInstanceState); después de agregar el fragmento. – Ankit

2

Solo para asegurarme de que estoy viendo esto bien, MyActivity es la actividad que estás intentando iniciar y luego agregar una instancia de FirstFragment, ¿no?

Inmediatamente veo dos cosas que usted necesita para mirar

1) en su actividad nunca llamas setContentView() o super.onCreate(). La primera llamada puede ser un gran problema para usted porque eso significa que su diseño nunca fue inflado, y por lo tanto, la variable R no existe

2) Su MyActivity necesita tener su propio archivo de diseño xml, que no necesita no tiene.

+0

Hola, no creo que una actividad deba tener un archivo de diseño, por ejemplo, mi código está funcionando después de que agregué super.onCreate (...), mi actividad solo alberga un fragmento, y el fragmento inflará un diseño para mostrar, no la actividad. –

+0

Es posible ya que no he usado mucho el paquete de soporte. La mayor parte de mi desarrollo está en Honeycomb usando diseños de paneles múltiples. Estaba mirando los documentos API y creo que tienes razón. ¡Gracias por señalar esto! –

+0

No hay problema, también soy nuevo en el paquete de soporte, comienzo a aprender el fragmento desde hoy :) –

4

dar una explicación:

El marco crea la Activity y pide Activity.onCreate().

Activity.onCreate() de alguna manera se conectará al FragmentManager para informarle acerca de la actividad de alojamiento. Activity.onDestroy() lo anulará nuevamente.

Ahora, extiende Activity y reemplaza onCreate(). Realiza llamadas al FragmentManager sin llamar al Activity.onCreate(). La lógica de registro completa explicada arriba no se ejecuta. Por lo tanto, el FragmentManager no sabe nada sobre la actividad y supone que ya se ha destruido y genera la excepción con el mensaje de error engañoso.

68

También me enfrenté a un problema similar.
Me di cuenta de que esto sucedió porque la actividad estaba siendo destruida mientras que el FragmentTransaction estaba a punto de obtener .commit().

Una solución para esto fue comprobar si el Activity.isFinishing() es verdadero o no.

if (!isFinishing()) { 
    FragmentTransaction ft = getSupportFragmentManager() 
    .beginTransaction(); 
    ft.replace(SOME_RES_ID, myFragmentInstance); 
    ft.commit(); 
} 
+0

¡Gracias funcionó para mí! Vine aquí a través de una [discusión sobre Github] (https://github.com/JakeWharton/ActionBarSherlock/issues/1031). Gracias por compartir. –

1

lo que hice es inmediatamente después de cometer llamo

fragmentManager.executePendingTransactions();

y nunca trato de confirmación después de onpause() llamada

Lea este Fragment Transactions & Activity State Loss

10

me enfrenté al mismo problema Artical y no puede arreglarlo. Evento También agregué el check de Finalización(). pero sin suerte.

luego agregué una comprobación más isDestroyed() y funciona bien ahora.

if (!isFinishing() && !isDestroyed()) { 
    FragmentTransaction ft = getSupportFragmentManager() 
    .beginTransaction(); 
    ft.replace(LAYOUT_ID, myFragmentInstance); 
    ft.commit(); 
} 
+1

Tenga en cuenta que 'onDestroyed()' se agregó en el nivel 17 de la API. – Gira

0

super.onCreate (savedInstanceState) llamará onCreate método en el FragmentActivity, la cual llamará mFragments.attachHost(null /*parent*/);

Esta frase será asignar un valor a mHost en FragmentController, cuando te llama FragmentTransaction.commit(),

En el método enqueueAction(), que tiene esta frases

if (mDestroyed || mHost == null) { 
     throw new IllegalStateException("Activity has been destroyed"); 
} 

Así que si usted no ha llame super.onCreate (savedInstanceState) antes de comprometerse una fragmentTransaction, se consigue esta excepción porque mHost es nulo

0

Si alguno viene a través tipo similar de emisión:

que estaba enfrentando mismo tiempo de problema, pero en mi caso de la Actividad principal estaba llamando a Fragment1 y luego, si el usuario hace clic en Fragment1 Layout, quiero iniciar otro Fragment2 Layout.

Pude ejecutar Fragment1 desde la actividad principal pero Fragment1 a Fragment2 estaba fallando con la excepción como "La actividad se ha destruido".

Resolví el problema anterior manteniendo el objeto FragmentManager como estático en la clase MainActivity. private static FragmentManager mfragmentManager = null;

llamando a ambos fragmentos utilizando el mismo objeto anterior, resolvió mi problema.

A continuación se muestra mi código de cambio de Fragmento de Actividad principal.

public void switchToFragment(String fragmentName){ 
     Fragment fragment = null; 
     switch (fragmentName) { 
      case "Fragment1":{ 
       fragment = new Fragment1(); 
       break; 
      } 
      case "Fragment2": { 
       fragment = new Fragment2(); 
       break; 
      } 
     } 

     FragmentTransaction transaction = mfragmentManager.beginTransaction(); 
     transaction.replace(R.id.fragment_container, fragment); 
     transaction.commit(); 
    } 
1

sigue siendo malo, porque ha obtenido un error “La actividad ha sido destruido”

ava.lang.IllegalStateException: Activity has been destroyed fragmentTransaction.commitAllowingStateLoss(); 

Así que mi solución es añadir comprobar if (!isFinishing()&&!isDestroyed())

if (!isFinishing()&&!isDestroyed()) { 
         fragmentTransaction.commitAllowingStateLoss(); 
        } 
       } 
Cuestiones relacionadas