簡體   English   中英

當方向改變時,不需要時重新創建片段

[英]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"

您應該在片段setRetainInstancetrue

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM