2014-03-03 43 views
1

我有一個簡單的活動,其中包含一個顯示碎片的ViewPager。ViewPager + Fragment + saveInstanceState

我的動態應顯示關於足球聯賽的信息,並且每個片段顯示器等livescroes /比賽日,表中的信息等

與我啓動活動意圖,包含聯賽標識。

而每個片段都需要這個聯盟ID來加載正確的數據。

所以我FragmentPagerAdapter看起來像這樣

public class LeaguePagerAdapter extends FragmentPagerAdapter { 

    private String leagueId; 

    public LeaguePagerAdapter(FragmentManager fm, String leagueId) { 
     super(fm); 
     this.leagueId = leagueId; 
    } 

    @Override 
    public Fragment getItem(int pos) { 
     if (pos == 0){ 
      return TableFragment.newInstance(leagueId); 
     } else {   
      return MatchdayFragment.newInstance(leagueId); 
     } 
    } 
} 

的TableFragment看起來像這樣(的比賽日片段看起來類似):

public class TableFragment extends PullToRefreshListViewAdFragment { 

    private String leagueId; 

    public static TableFragment newInstance(String leagueId) { 
     TableFragment t = new TableFragment(); 
     t.leagueId = leagueId; 
     return t; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
       // Setup UI and load data 
     } 
} 

有時leagueId爲空。我看到崩潰日誌中的異常(crittercism)。但我問自己爲什麼。在我看來,問題是活動在後臺被破壞並重建(例如)用戶使用多任務按鈕切換到我的應用程序時。

所以,據我所知,如果活動已被刪除,原始意圖將由Android本身內部存儲。因此,我沒有在我的活動和片段中實現任何onSaveInstanceState()。在我的活動中,我讀了Intent Extra以檢索leagueId。這工作正常,還恢復活動。我認爲通過重新創建活動,將創建一個新的LeaguePagerAdapter,並且所有片段也將被新創建。

這是正確的嗎?或者「舊」片段實例將被恢復,因此leagueId爲空(因爲該片段沒有在碎片onSaveInstanceState方法中存儲leagueId?)。

有沒有一種方法來測試這種生命週期的事情

回答

0

它之所以爲空是因爲系統還原默認構造的片段。以下是文檔的說明:

每個片段都必須有一個空的構造函數,因此它可以在恢復其活動狀態時實例化。強烈建議子類沒有帶參數的其他構造函數,因爲這些構造函數在重新實例化時不會被調用;相反,調用者可以使用setArguments(Bundle)提供參數,然後使用getArguments()由Fragment檢索參數。

編輯:還有,看看這個:Fragment's onSaveInstanceState() is never called

編輯:爲了進一步增加時,你與你的newInstance(String)方法創建片段。如果你的Fragment被Android殺死了,它使用默認構造函數,所以你的leagueId變量不會被設置。嘗試使用setArguments/getArguments將值傳遞到您的Fragment中。

+0

所以我的假設,一個完整的新片段將被實例化是錯誤的?而由setArguments()設置的參數將通過銷燬碎片自動保存? – sockeqwe

+0

@sockeqwe如果你使用'setArguments'而不是像你所做的那樣直接操縱字段,那麼就我所知(從我見過的其他答案中),當重新創建你的Fragment時,系統將再次使用這些相同的參數。現在問題是你用'newInstance'實例化你的Fragment,然後在該方法中設置字段。 Android在重新創建時不使用'newInstance'。因此,嘗試使用'newInstance'內的'setArguments'將'leagueId'傳遞給你的片段,看看是否有效。要測試您可以嘗試方向更改或使用DDMS殺死您的進程。 –

+0

當然,如果您使用'setArguments',那麼您必須使用'getArguments'檢索值。 –

相關問題