簡體   English   中英

Android片段在方向更改時重新創建

[英]Android Fragments recreated on orientation change

我正在開發一個基本上有ActionBar的應用程序。 當我的應用程序啟動時,Activity會創建片段並將它們附加到每個選項卡,因此當我切換時,我會得到不同的視圖。

當我嘗試旋轉設備時出現問題。 經過一番努力,我注意到Android會自動重新創建以前添加的片段,如下所示:

SummaryFragment.onCreate(Bundle) line: 79   
FragmentManagerImpl.moveToState(Fragment, int, int, int) line: 795  
FragmentManagerImpl.moveToState(int, int, int, boolean) line: 1032  
FragmentManagerImpl.moveToState(int, boolean) line: 1014    
FragmentManagerImpl.dispatchCreate() line: 1761 
DashboardActivity(Activity).onCreate(Bundle) line: 864  
...

然后像往常一樣重新創建片段。 因此,我希望能夠正常工作的“真實”片段以及使我的應用程序崩潰的“隱藏”Android創建的對應物。 我該如何避免這種行為? 我已經嘗試在SummaryFragment中調用setRetainInstance(false)。

謝謝

您需要檢查savedInstanceState [edit:在您的父活動中],如果它存在,請不要創建您的片段。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    if (savedInstanceState == null) {
         // Do your oncreate stuff because there is no bundle   
    }
// Do stuff that needs to be done even if there is a saved instance, or do nothing
}

如果兩個方向都有類似的ui(沒有特定的layout-land文件),可以將android:configChanges="keyboardHidden|orientation"設置為清單文件中的活動。

如果沒有提供您將片段添加到標簽的源代碼,我會盡力幫助您改進。

創建活動時,請檢查以確保它尚不存在。 如果它存在,不做任何事...... Android將為您重新創建它。

private void initFragment() {
        FragmentManager fragMgr = getSupportFragmentManager();
        if (fragMgr.findFragmentByTag(LEADERBOARD_FRAG_TAG) != null) { return; }
        frag = new HdrLeaderboardFragment();
        FragmentTransaction ft = fragMgr.beginTransaction();
        ft.replace(R.id.leaderboard_fragment_wrapper, frag, LEADERBOARD_FRAG_TAG);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
        ft.commit();
    }

我不確定是否有更好的解決方案,但這是我在最新計划中所做的。

系統在方向更改時自動創建片段,並且如果要在主機活動中跟蹤它們,請在主機活動的OnAttachFragment()方法中捕獲它們。 並且它們默認獲取參數,因此您可以使用它們來找出它是哪個片段。

   public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);
    if (fragment != null) {
        if(fragment.getArguments() != null) {
            switch (fragment.getArguments().getString(ARG_PARAM1)) {
                case FragmentATag:
                    if (myFragmentA != fragment) {
                        myFragmentA = (FragmentA) fragment;
                    }                     
                    break;
                case FragmentBTag:
                    if (myFragmentB != fragment) {
                        myFragmentB = (FragmentB) fragment;
                    }                        
                    break;                  
            }
        }
     }
   }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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