2

我已經有兩個屬性的活動:的Android ViewPager和片段的序列化

  • 私人片段firstFragment;
  • private Fragment secondFragment;

在onCreate方法:

adapter = new MyPagerAdapter(getSupportFragmentManager()); 
    pager = (ViewPager) findViewById(R.id.pager); 
    pager.setAdapter(adapter); 
    pager.setOffscreenPageLimit(6); 
    pager.setSaveEnabled(true); 

其中MyPagerAdapter延伸FragmentStatePagerAdapter類。 進入的getItem()方法:

@Override 
    public Fragment getItem(int position) { 

     Bundle args = new Bundle(); 

     switch (position) { 
      case FIRST: 
       secondFragment = new FirstFragment(); 
       secondFragment.setArguments(args); 
       return secondFragment; 
      case SECOND: 
       secondFragment = new SecondFragment(); 
       secondFragment.setArguments(args); 
       return secondFragment; 
     } 
    } 

和所有工作正常。

但是,當我改變屏幕方向時,私人屬性設置爲空,我失去了兩個片段的引用。 所以我試圖序列化該片段有:

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    getSupportFragmentManager().putFragment(outState, FirstFragment.class.getName(), firstFragment); 
    getSupportFragmentManager().putFragment(outState, SecondFragment.class.getName(), secondFragment); 
} 

並將它們加載到onCreate方法有:

if (savedInstanceState != null) { 
     firstFragment = (FirstFragment) getSupportFragmentManager().getFragment(savedInstanceState, FirstFragment.class.getName()); 
     secondFragment = (SecondFragment) getSupportFragmentManager().getFragment(savedInstanceState, SecondFragment.class.getName()); 
    } 

我的問題:

1.是否正確的方法序列化片段變成活動屏幕方向變化?

2.有時我有錯誤:「解組未知類型代碼55偏移448」,是有可能,它已經由片段序列化造成的「

編輯:

我需要因爲我一個監聽器接口爲活動有片段作爲活動屬性是:

@Override 
public void executeTask(String what) { 
    secondFragment.executeTask(what); 
} 

這種方法被調用到firstFragment所以FirstFragment即可。執行SecondFragment的方法。

回答

0

我不知道什麼可能是問題的原因,但我給你可能會提供幫助。

我不認爲你應該參考FragmentsAdapterActivity。 主要原因是很難同步Activity生命週期,Fragment生命週期和ViewPager兒童生命週期。如果出現任何錯誤,調試可能會非常痛苦。 相信我,在那裏,做到了......

順便說一句 - 是有一個原因,你需要在你的ActivityFragments引用?

編輯

我不認爲你應該通過Fragments之間。這樣的信息。一般來說,FragmentManager手柄(創建,刪除)Fragments在它自己的,你不能確信這些Fragments將可在任何時間。

我認爲最好的辦法是在Fragments您的數據移動到單獨的模型(數據庫條目,SharedPreference或singelton類),然後讓知道Adapter數據已經改變(由或簡單地通知Adapter通過致電notifyDataChanged更新兒童數據)。

FragmentA --->監聽器(reloadData())--->活動--->adapter.notifyDataChanged() -----> fragmentB得到更新

這樣,如果你想添加ThirdFragment或事實上將使用數據的任何數量的Fragments你將不必擔心任何的這些更新數據 - 只是讓Adapter擔心。

+0

你說得對。我編輯我的問題... – CeccoCQ

+0

這是一個很好的解決方法和可能,這是解決該片段的序列化的正確途徑。使用DataObserver將已加載的數據更改爲片段和業務模塊以執行任何其他類型的操作。 – CeccoCQ

0

如果您對縱向和橫向使用相同的佈局,那麼當方向更改時,您可以避免活動重新創建。改變你的表現爲...

 <activity android:name=".activity.MainActivity" 
     android:configChanges="keyboardHidden|orientation|screenSize"> 
    </activity> 

,然後在活動覆蓋onConfigurationChanged()...

@Override 
    public void onConfigurationChanged(Configuration  newConfig) 
    { 
     super.onConfigurationChanged(newConfig); 
    } 
+0

你是什麼意思與相同的佈局?組件的結構?我有一些佈局文件到佈局,正常的土地,等... – CeccoCQ

+0

您是否使用了縱向和橫向相同的佈局?那麼您可以避免在方向更改時保存狀態。 – Libin

+0

不,我爲這個視圖使用了不同的xml。 – CeccoCQ