wake-up-neo.com

Sehr einfacher Code, aber es wurde der Fehler "Aktivität wurde zerstört" bei Verwendung von Fragment 

Ich habe eine sehr einfache Aktivität gemacht, die ein einfaches ListFragment wie unten zeigt:

Meine Aktivität:

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

}

Meine ListeFragment:

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

Wenn ich meine App starte, erhielt ich Fehlermeldung :

 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)
...

Es klagt, dass Aktivität zerstört wurde , Warum ???

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>
18
Leem.fin

Ich hatte auch ein ähnliches Problem.
Mir wurde klar, dass dies der Fall war, weil die Aktivität zerstört wurde, während die FragmentTransaction.commit() bekam.

Eine Lösung für dieses Problem bestand darin, zu prüfen, ob die Activity.isFinishing() wahr ist oder nicht.

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

Ich habe selbst herausgefunden, dass ich die super.onCreate(savedInstanceState); in meiner Activity onCreate () -Methode verpasst habe. Nachdem dies hinzugefügt wurde, sind die Dinge in Ordnung. 

32
Leem.fin

Ich war mit dem gleichen Problem konfrontiert und konnte es nicht beheben. Ereignis, das ich hinzugefügt habe, ist ebenfalls Finishing (). aber kein glück.

dann fügte ich einen weiteren check isDestroyed () hinzu und es funktioniert jetzt einwandfrei.

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

Um eine Erklärung zu geben:

Das Framework erstellt die Activity und ruft Activity.onCreate() auf.

Activity.onCreate() verbindet sich irgendwie mit der FragmentManager, um sie über die Hosting-Aktivität zu informieren. Activity.onDestroy() hebt die Registrierung wieder auf.

Jetzt erweitern Sie Activity und überschreiben onCreate(). Sie rufen FragmentManager auf, ohne durchActivity.onCreate() aufzurufen. Die gesamte oben erläuterte Registrierungslogik wird nicht ausgeführt. Die Variable FragmentManager weiß daher nichts über die Aktivität und geht davon aus, dass sie bereits zerstört wurde und generiert die Ausnahme mit der irreführenden Fehlermeldung.

4
sstn

Um sicherzugehen, dass ich das richtig sehe, ist MyActivity die Aktivität, die Sie starten möchten, und dann eine Instanz von FirstFragment hinzufügen, oder?

Sofort sehe ich zwei Dinge, die Sie betrachten müssen

1) In Ihrer Aktivität rufen Sie niemals setContentView () oder super.onCreate () auf. Der erste Aufruf könnte für Sie ein großes Problem darstellen, da Ihr Layout nie aufgebläht wurde und die R-Variable daher nicht vorhanden ist

2) MyActivity benötigt eine eigene XML-Layout-Datei, die nicht vorhanden ist.

was ich getan habe, ist unmittelbar nach dem Festschreiben, das ich anrufe 

fragmentManager.executePendingTransactions();

und versuchen Sie niemals, nach dem Aufruf von onpause() einen Commit auszuführen

Lesen Sie diese Artikel Fragmenttransaktionen und Aktivitätsverlust

1
Asim Habib

Immer noch schlecht, weil Fehler "Aktivität wurde zerstört"

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

Meine Lösung ist also Add Check if (!isFinishing()&&!isDestroyed())

 if (!isFinishing()&&!isDestroyed()) {
                        fragmentTransaction.commitAllowingStateLoss();
                    }
                }
1
Serg Burlaka

Wenn jemand auf eine ähnliche Art von Problem stößt:

Ich befand mich zur gleichen Zeit des Problems, aber in meinem Fall von Main Activity rief ich zu Fragment1 an und wenn der Benutzer auf Fragment1-Layout klickt, möchte ich ein anderes Fragment2-Layout starten.

Ich konnte Fragment1 von der Hauptaktivität aus starten, aber Fragment1 bis Fragment2 schlug mit der Ausnahme fehl, da "Aktivität wurde zerstört"

Das obige Problem wurde behoben, indem das FragmentManager-Objekt in der MainActivity-Klasse statisch gehalten wurde. Privates statisches FragmentManager mfragmentManager = null;

aufrufen beider Fragmente mit demselben Objekt oben, mein Problem behoben.

Unten ist mein Fragment-Wechselcode aus der Hauptaktivität.

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();
    }
0
Rohan J Mohite

super.onCreate (savedInstanceState) ruft die onCreate-Methode in FragmentActivity auf, wodurch mFragments.attachHost(null /*parent*/); aufgerufen wird.

Dieser Satz weist mHost in FragmentController einen Wert zu, wenn Sie FragmentTransaction.commit () aufrufen.

In der Methode enqueueAction() hat es diese Sätze 

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

Wenn Sie also vor dem Festschreiben einer fragmentTransaction nicht super.onCreate (savedInstanceState) aufgerufen haben, wird diese Ausnahme angezeigt, da mHost null ist 

0
dx3904