Sehr einfacher Code, aber Fehler "Aktivität wurde zerstört" wenn Fragment verwendet
Machte ich einen sehr einfachen Aktivität das zeigt eine einfache ListFragment wie unten:
Meine Tätigkeit:
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 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));
}
...
}
Wenn ich meine app, ich habe 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)
...
Beschwert es sich, 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>
InformationsquelleAutor der Frage Leem.fin | 2012-02-03
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich auch vor ein ähnliches problem.
Ich erkannte, dass dies geschah, weil die activity wurde zerstört, während die
FragmentTransaction
jetzt.commit()
.Einer Lösung für dieses war zu prüfen, ob die
Activity.isFinishing()
wahr ist oder nicht.InformationsquelleAutor der Antwort rishabhmhjn
Dachte ich mir, ist Es, weil ich verpasste die
super.onCreate(savedInstanceState);
in meiner Activity onCreate () - Methode . Nach dazu, die Dinge sind in Ordnung.InformationsquelleAutor der Antwort Leem.fin
Ich Stand vor dem gleichen Problem und nicht in der Lage, es zu beheben.
Event Hinzugefügt habe ich isFinishing() prüfen, wie gut. aber kein Glück.
dann habe ich noch eine check isDestroyed() und seine arbeiten fein jetzt.
InformationsquelleAutor der Antwort vikoo
Eine Erklärung zu geben:
Rahmen schafft die
Activity
und fordertActivity.onCreate()
.Activity.onCreate()
irgendwie befestigen, um dieFragmentManager
um ihn wissen zu lassen über die hosting-Aktivitäten.Activity.onDestroy()
wird Registrierung es wieder.Nun, Sie erweitern
Activity
und überschreibenonCreate()
. Sie telefonieren zuFragmentManager
ohne Aufruf durchActivity.onCreate()
. Die ganze Registrierung Logik oben erklärt, wird nicht ausgeführt. DieFragmentManager
daher nicht wissen, etwas über die Tätigkeit und nimmt an, dass es bereits zerstört wurde, und erzeugt die Ausnahme mit der irreführenden Fehlermeldung.InformationsquelleAutor der Antwort sstn
Nur um sicherzugehen, ich sehe das richtig, MyActivity ist die Aktivität, die Sie versuchen zu starten und fügen Sie dann eine Instanz von FirstFragment in, richtig?
Sofort sehe ich zwei Dinge, die Sie benötigen, zu betrachten
1) In Ihrer Tätigkeit, die Sie nie Aufruf setContentView() oder super.onCreate(). Der erste Aufruf könnte ein großes Problem für Sie, weil das bedeutet, dass das layout wurde nie aufgeblasen werden, und damit die R-variable nicht existiert
2) Ihre MyActivity haben muss, um seine eigenen xml-layout-Datei, die es nicht haben.
InformationsquelleAutor der Antwort David C. Sainte-Claire
was ich gemacht habe, sofort nach dem commit nenne ich
fragmentManager.executePendingTransactions();
, und versuchen Sie nie zu Begehen, nachdem
onpause()
genanntLesen Sie diesen Artikel Fragment-Transaktionen & Aktivitäts-Status-Verlust
InformationsquelleAutor der Antwort Asim Habib
Immer noch schlecht, da erhielt den Fehler "Aktivität zerstört wurde"
Also meine Lösung ist, fügen Sie
if (!isFinishing()&&!isDestroyed())
InformationsquelleAutor der Antwort Serg Burlaka
Wenn eine kommen, über eine ähnliche Art der Ausgabe:
Ich Stand vor dem gleichen Zeitpunkt der Ausgabe, aber in meinem Fall aus der Haupttätigkeit, ich rief zu Fragment1 und dann, wenn Benutzer klicken Sie auf Fragment1 Layout möchte ich zum starten eines anderen Fragment2 auf Layout.
War ich in der Lage zu starten Fragment1 von Haupt-Aktivität, aber Fragment1 zu Fragment2 es wurde nicht mit Ausnahme, wie "Aktivität zerstört wurde" .
Ich entschloss mich, oben genannte Problem durch die Aufrechterhaltung der FragmentManager Objekt als static in der MainActivity-Klasse.
private static FragmentManager mfragmentManager = null;
aufrufen, um beide Fragmente mit gleichen oben genannten Objekt, mein Problem gelöst.
Unten ist mein Fragment Umschalten der code aus der Main Activity.
InformationsquelleAutor der Antwort Rohan J Mohite
super.onCreate(savedInstanceState) ruft onCreate-Methode in FragmentActivity, die rufen
mFragments.attachHost(null /*parent*/);
Dieser Satz wird einen Wert zuweisen
mHost
im FragmentController, wenn Sie Anrufe FragmentTransaction.commit() ,In der Methode
enqueueAction()
es hat diese SätzeAlso, wenn Sie nicht nennen super.onCreate(savedInstanceState), bevor Sie einen commit für eine fragmentTransaction, erhalten Sie diese Ausnahme, weil mHost ist null
InformationsquelleAutor der Antwort dx3904