2017-06-06 14 views
0

Ich habe eine Aktivität mit einem Container, der ein FrameLayout ist. Ich muss diesem Container ein Fragment hinzufügen, aber dadurch wird eine IllegalStateException ausgelöst, die meine Aktivität zerstört.Fragment hinzufügen zerstört Aktivität

Dies ist mein Behälter in der Aktivität Layout:

<FrameLayout 
    android:id="@+id/seeMoreContainer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
</FrameLayout> 

Dies ist, wie ich das Fragment auf die Aktivität

PlacesSeeMoreFragment placesSeeMoreFragment = new PlacesSeeMoreFragment(); 
Bundle bundle = new Bundle(); 
bundle.putInt(PlacesSeeMoreFragment.KEY, poiID); 
placesSeeMoreFragment.setArguments(bundle); 
getSupportFragmentManager().beginTransaction().add(R.id.seeMoreContainer, 
placesSeeMoreFragment).commit(); 

hinzufügen Und das ist die logcat

java.lang.IllegalStateException: Activity has been destroyed 
                    at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1515) 
                    at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634) 
                    at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613) 
                    at net.ilb.Activities.PlacesActivity.openPlaceSeeMore(PlacesActivity.java:140) 

Was mache ich hier falsch?

EDIT:

ich das Fragment auf die Aktivität von einer öffentlichen Methode hinzufügen, die ich von onItemClickListener eines Listview nennen

Das ist das ganze Verfahren

public void openPlaceSeeMore(int poiID){ 
    PlacesSeeMoreFragment placesSeeMoreFragment = new PlacesSeeMoreFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putInt(PlacesSeeMoreFragment.KEY, poiID); 
    placesSeeMoreFragment.setArguments(bundle); 
    getSupportFragmentManager().beginTransaction().add(R.id.seeMoreContainer, placesSeeMoreFragment).commit(); 
} 

Und so Die Methode heißt

mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      PlacesActivity placesActivity = new PlacesActivity(); 
      placesActivity.openPlaceSeeMore(poi.getId()); 
     } 
    }); 
+0

Was ist diese Zeile PlacesActivity.java:140? – k0sh

+0

@ k0sh Es ist diese Zeile: getSupportFragmentManager(). BeginTransaction(). Add (R.id.seeMoreContainer, placesSeeMoreFragment) .commit(); –

Antwort

1

Ich denke, man dies nennen:

PlacesActivity placesActivity = new PlacesActivity(); 

Dies ist ein sehr falscher Ansatz ein Verfahren, bei Aktivität erklärt zu nennen. Erstellt eine neue Instanz Ihrer Aktivität jedes Mal, wenn Sie auf einen Eintrag in der Liste klicken. Plus, wenn Sie Listenklicks erfassen möchten, sollten Sie eine Schnittstelle verwenden und Aktivitätsobjekte nirgendwo verwenden.

Hoffe, das hilft.

1

Verwenden Sie den folgenden Code ....

Fragment fragment = new PlacesSeeMoreFragment(); 
       FragmentManager fm = getActivity().getSupportFragmentManager(); 
       FragmentTransaction ft = fm.beginTransaction(); 
       ft.replace(R.id.content_frame, fragment); 
       ft.commit(); 
       Bundle bundle = new Bundle(); 
       bundle.putInt(PlacesSeeMoreFragment.KEY, poiID);     
       fragment.setArguments(bundle); 
+0

Die gleiche Ausnahme wird ausgelöst. –

+0

Verwenden Sie ActivityName.this anstelle von getActivity im Code. –

+0

Das hat leider nichts geändert. –

1

Irgendwann sah ich das gleiche Problem und das ist, was ich getan habe. Verwenden Sie commitAllowingStateLoss() anstelle von commit(). Versuchen Sie diese

getSupportFragmentManager().beginTransaction().add(R.id.seeMoreContainer, placesSeeMoreFragment).commitAllowingStateLoss(); 
+0

Es wirft immer noch dieselbe Ausnahme auch mit commitAllowingStateLoss(). –

-1

dies versuchen,

PlacesSeeMoreFragment placesSeeMoreFragment = new PlacesSeeMoreFragment(); 
    Bundle bundle = new Bundle(); 
    bundle.putInt(PlacesSeeMoreFragment.KEY, poiID); 
    placesSeeMoreFragment.setArguments(bundle); 
    FragmentManager manager = getSupportFragmentManager(); 
    FragmentTransaction transaction=manager.beginTransaction(); 
        transaction.add(R.id.seeMoreContainer, placesSeeMoreFragment); 
    transaction.commit(); 
+0

Nach dem Überschreiben von onDetach des Fragments wird dieselbe Ausnahme ausgelöst. Sollte es nicht fangen und stattdessen RuntimeException werfen? –

+0

versuchen Sie die aktualisierte Antwort. – Omi

+0

Die aktualisierte Antwort ist im Grunde, was ich tue, obwohl Sie einen Fragment-Manager und eine Transaktion definieren, anstatt sie direkt zu verwenden. –

Verwandte Themen