2017-06-06 14 views
0

私は、コンテナがFrameLayoutであるアクティビティを持っています。そのコンテナにフラグメントを追加する必要がありますが、そうするとIllegalStateExceptionがスローされ、自分のアクティビティが破棄されます。フラグメントを追加するとアクティビティが破棄されます

これは、活動レイアウトの私のコンテナです:

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

これは私が活動

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

にフラグメントを追加し、これは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) 

は何であるかであります私はここで間違っていますか?

EDIT:

私はこれが全体の方法

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

であり、これはどのようにあるリストビュー

のonItemClickListenerから呼び出すパブリックメソッドから活動にフラグメントを追加このメソッドは呼び出されます

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

この行は何ですかPlacesActivity.java:140? – k0sh

+0

@ k0shこれは次の行です。 getSupportFragmentManager()。beginTransaction()。add(R.id.seeMoreContainer、 placesSeeMoreFragment).commit(); –

答えて

1

、これを試してみてください、この1

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

以下のコードを使用します。

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

同じ例外がスローされています。 –

+0

コードでgetActivityの代わりにActivityName.thisを使用します。 –

+0

これを使うと、残念なことに何も変わりませんでした。 –

1

いつか私は同じ問題に直面し、これは私がしたことです。 commit()の代わりにcommitAllowingStateLoss()を使用してください。

PlacesActivity placesActivity = new PlacesActivity(); 

これは、活動に宣言されたメソッドを呼び出すための非常に間違ったアプローチである:私はあなたがこれを呼び出していると思います

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

commitAllowingStateLoss()でも同じ例外がスローされます。 –

-1

を試してみてください。 リストの何かをクリックするたびに、あなたの活動の新しいインスタンスが作成されます。さらに、リストのクリックをキャプチャする場合は、インターフェイスを使用し、どこでもアクティビティオブジェクトを使用しないでください。

これが役に立ちます。

+0

フラグメントのonDetachをオーバーライドした後、同じ例外がスローされます。それを捕まえてRuntimeExceptionを投げるべきではありませんか? –

+0

更新された回答を試してください。 – Omi

+0

更新された答えは、基本的に私がやっていることですが、フラグメントマネージャとトランザクションを直接使用するのではなく、定義しています。 –

関連する問題