我有一個簡單的活動,其中包含一個顯示碎片的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?)。
有沒有一種方法來測試這種生命週期的事情
所以我的假設,一個完整的新片段將被實例化是錯誤的?而由setArguments()設置的參數將通過銷燬碎片自動保存? – sockeqwe
@sockeqwe如果你使用'setArguments'而不是像你所做的那樣直接操縱字段,那麼就我所知(從我見過的其他答案中),當重新創建你的Fragment時,系統將再次使用這些相同的參數。現在問題是你用'newInstance'實例化你的Fragment,然後在該方法中設置字段。 Android在重新創建時不使用'newInstance'。因此,嘗試使用'newInstance'內的'setArguments'將'leagueId'傳遞給你的片段,看看是否有效。要測試您可以嘗試方向更改或使用DDMS殺死您的進程。 –
當然,如果您使用'setArguments',那麼您必須使用'getArguments'檢索值。 –