2017-06-06 107 views
0

我有一個活動,容器是一個FrameLayout。我需要爲該容器添加一個片段,但這樣會拋出IllegalStateException,從而破壞我的Activity。添加片段破壞活動

這是我在活動佈局容器:

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

什麼我在這裏做錯了嗎?

編輯:

我的片段從一個公共方法,這是我從一個ListView

的onItemClickListener調用添加到活動這是整個方法

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

這是怎麼該方法被稱爲

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

我猜你是調用此:

PlacesActivity placesActivity = new PlacesActivity(); 

這是非常錯誤的做法來調用活動聲明的方法。 每次單擊列表上的某個內容時,它都會創建一個新的活動實例。另外,如果你想捕獲列表點擊,你應該使用一個接口,而不是在任何地方使用活動對象。

希望這會有所幫助。

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

在代碼中使用ActivityName.this而不是getActivity。 –

+0

不幸的是,使用這樣做並沒有改變任何東西。 –

1

有時我面臨同樣的問題,這就是我所做的。使用commitAllowingStateLoss()而不是commit()。試試這個

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

即使使用commitAllowingStateLoss(),它仍會引發相同的異常。 –

-1

試試這個,

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

重寫onDetach片段後,拋出相同的異常。它不應該捕獲它並拋出RuntimeException嗎? –

+0

嘗試更新答案。 – Omi

+0

更新後的答案基本上是我在做的,儘管你定義了一個片段管理器和事務,而不是直接使用它們。 –