[英]Android ViewPager and Fragment serialization
我有一个具有两个属性的活动:
在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;
}
}
一切正常。
但是,当我更改屏幕方向时,专用属性设置为null,并且丢失了两个片段的引用。 因此,我尝试使用以下方式序列化此片段:
@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.有时会出现错误:“在偏移量448处解组未知类型代码55”,这可能是由片段序列化引起的吗?”
编辑:
我需要将片段作为活动属性,因为我将监听器接口连接到活动中:
@Override
public void executeTask(String what) {
secondFragment.executeTask(what);
}
该方法被调用到firstFragment中。 因此,FirstFragment可以执行SecondFragment的方法。
如果您对纵向和横向使用相同的布局,则在更改方向时可以避免重新创建活动。 将清单更改为...
<activity android:name=".activity.MainActivity"
android:configChanges="keyboardHidden|orientation|screenSize">
</activity>
然后在活动中覆盖onConfigurationChanged()...
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
我不确定造成问题的原因是什么,但我会给您提示可能会有所帮助。
我不认为您应该从Activity
引用Adapter
的Fragments
。 主要是由于很难同步Activity
生命周期, Fragment
生命周期和ViewPager
子代生命周期。 如果出现任何错误,调试可能会非常痛苦。 相信我,去过那里,做到了...
顺便说一句-是否有理由为什么您需要在Activity
引用Fragments
?
编辑
我认为您不应该以这种方式在Fragments
之间传递信息。 通常, FragmentManager
自行处理(创建,删除) Fragments
,您无法确保这些Fragments
随时可用。
我认为最好的方法是将数据移动到单独的模型(数据库条目, SharedPreference
或singelton类),然后让Adapter
知道数据已更改(由Fragments
的DataObserver
或简单地通知Adapter
来更新子数据)通过调用notifyDataChanged
)。
例
FragmentA ---> listener( reloadData()
)---> Activity ---> adapter.notifyDataChanged()
-----> fragmentB得到更新
这样,如果您要添加ThirdFragment
或实际上可以使用数据的任何数量的Fragments
,您就不必担心其中任何一个中的更新数据-只需让Adapter
为其担心。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.