繁体   English   中英

Android ViewPager和片段序列化

[英]Android ViewPager and Fragment serialization

我有一个具有两个属性的活动:

  • 私有片段firstFragment;
  • 私有片段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;
        }
    }

一切正常。

但是,当我更改屏幕方向时,专用属性设置为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引用AdapterFragments 主要是由于很难同步Activity生命周期, Fragment生命周期和ViewPager子代生命周期。 如果出现任何错误,调试可能会非常痛苦。 相信我,去过那里,做到了...

顺便说一句-是否有理由为什么您需要在Activity引用Fragments

编辑

我认为您不应该以这种方式在Fragments之间传递信息。 通常, FragmentManager自行处理(创建,删除) Fragments ,您无法确保这些Fragments随时可用。

我认为最好的方法是将数据移动到单独的模型(数据库条目, SharedPreference或singelton类),然后让Adapter知道数据已更改(由FragmentsDataObserver或简单地通知Adapter来更新子数据)通过调用notifyDataChanged )。

FragmentA ---> listener( reloadData() )---> Activity ---> adapter.notifyDataChanged() -----> fragmentB得到更新

这样,如果您要添加ThirdFragment或实际上可以使用数据的任何数量的Fragments ,您就不必担心其中任何一个中的更新数据-只需让Adapter为其担心。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM