![](/img/trans.png)
[英]media player does not load when activity is recreated on orientation change
[英]Fragment is Recreated when orientation change, when not needed
我有一個與布局有關的應用程序。 在肖像中,我在屏幕上有一個碎片,在土地上有兩個。
在我的活動的OnCreate中:
frameDetailsFragment = (FrameLayout) findViewById(R.id.detailsFragment);
if (frameDetailsFragment != null){
if (EntryPool.getPool(this).getEntries().size() > 0) {
detailsFragment = DetailsFragment.newInstance(EntryPool.getPool(this).getEntries().get(0));
getFragmentManager().beginTransaction()
.add(R.id.detailsFragment, detailsFragment, DETAILS_FRAGMENT)
.commit();
}
}
因此,當我們使用肖像時,我們不會創建DetailsFragment。 在DetailsFragment中,沒有任何有趣的東西,沒有setRetainState,並且我沒有在onAtach()中保存活動。 我只是注銷生命周期方法。 因此,當我在portarit中啟動應用程序時,它可以工作(不會創建“細節碎片”)。 然后我旋轉-詳細信息創建碎片。 然后我再次旋轉-我看到了:
04-22 12:06:42.737 2692 2692 I ANT DetailsFragment :: onDestroy
04-22 12:06:42.737 2692 2692 I ANT DetailsFragment :: onDetach
04-22 12:06:42.761 2692 2692 I ANT DetailsFragment :: onAttach
04-22 12:06:42.761 2692 2692 I ANT DetailsFragment :: onCreate
04-22 12:06:42.805 2692 2692 D ANT MainActivity oncretae
04-22 12:06:42.845 2692 2692 I ANT DetailsFragment :: onCreateView
04-22 12:06:42.857 2692 2692 I ANT DetailsFragment :: onActivityCreated
如我們所見,碎片減少了碎片管理器。 為什么? 請幫我,我看不到這種行為的任何邏輯-執行添加片段事務時,我沒有wrotye setRetainInstanse或addToBackState
由於您的問題是為什么會這樣(其他答案都是關於如何阻止它的原因):
發生這種情況是因為Activity不知道何時從保存的實例狀態恢復Fragment,而不再需要該Fragment。 如果在活動恢復視圖層次之后,存在一個視圖,其ID與Fragment最初添加的視圖具有相同的ID(transaction.add中的第一個參數),則將在輪換更改后重新添加該視圖。
在清單文件中添加以下代碼,在其中聲明要從中調用片段的活動:
android:configChanges="keyboardHidden|orientation|screenSize"
您應該在片段setRetainInstance
為true
public void setRetainInstance (boolean retain)
控制是否在活動重新創建期間保留片段實例(例如,通過配置更改)。 這只能與不在后堆棧中的片段一起使用。 如果設置,則重新創建活動時片段的生命周期將略有不同:
onDestroy()
將不會被調用(但onDetach()
仍會被調用,因為該片段正在從其當前活動中分離出來)。 由於不會重新創建片段,因此不會調用onCreate(Bundle)。 onAttach(Activity)
和onActivityCreated(Bundle
)仍將被調用。
我決定了以下問題的解決方法-在OnSaveInstance狀態下,我僅使用片段管理器刪除了片段(如果存在):
@Override
protected void onSaveInstanceState(Bundle outState) {
if (detailsFragment != null) {
getFragmentManager().beginTransaction()
.remove(detailsFragment)
.commit();
}
super.onSaveInstanceState(outState);
}
借助於此鈎子,只有在片段通過onCreate的檢查后,該片段才會在Activity中再次創建:
if (frameDetailsFragment != null){
if (EntryPool.getPool(this).getEntries().size() > 0) {
detailsFragment = DetailsFragment.newInstance(EntryPool.getPool(this).getEntries().get(0));
getFragmentManager().beginTransaction()
.add(R.id.detailsFragment, detailsFragment, DETAILS_FRAGMENT)
.commit();
}
但是可以肯定的是,必須有更好的解決方案,只有將片段從onCreate中調用時,才可以強制片段被重新整理,分離和永遠不被刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.