【问题标题】:Android ViewPager and Fragment serializationAndroid ViewPager 和 Fragment 序列化
【发布时间】:2014-05-03 05:57:05
【问题描述】:

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

  • private Fragment firstFragment;
  • 私有 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;
        }
    }

一切正常。

但是,当我改变屏幕方向时,私有属性设置为 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。有时我会出现错误:“Unmarshalling unknown type code 55 at offset 448”,这可能是由片段序列化引起的吗?”

编辑:

我需要将片段作为活动属性,因为我有一个进入活动的侦听器接口:

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

这个方法被调用到 firstFragment。所以FirstFragment可以执行SecondFragment的方法。

【问题讨论】:

    标签: android serialization android-fragments android-viewpager parcelable


    【解决方案1】:

    我不确定问题的原因,但我会给你一个提示,可能会有所帮助。

    我认为您不应该从Activity 中引用Adapter 中的Fragments。 主要是因为很难同步Activity 生命周期、Fragment 生命周期和ViewPager 子生命周期。如果出现任何错误,调试会非常痛苦。 相信我,去过那里,做到了……

    顺便说一句 - 您是否有理由需要在您的 Activity 中引用 Fragments

    编辑

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

    我认为最好的方法是将您的数据移动到单独的模型(数据库条目,SharedPreference 或单格顿类),然后让 Adapter 知道数据已更改(通过 DataObserver in @ 987654336@ 或直接通过调用notifyDataChanged 通知Adapter 更新儿童数据。

    示例

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

    这样,如果您想添加 ThirdFragment 或实际上任何数量的 Fragments 来使用数据,您将不必担心更新其中任何一个中的数据 - 只需让 Adapter 担心关于它。

    【讨论】:

    • 这是一个很好的解决方法,并且可能这是解决片段序列化的正确方法。使用 DataObserver 将加载的数据更改为片段和业务模块以执行任何其他类型的操作。
    【解决方案2】:

    如果您对纵向和横向使用相同的布局,那么当方向更改时,您可以避免重新创建活动。将您的清单更改为...

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

    然后在活动中覆盖 onConfigurationChanged() ...

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

    【讨论】:

    • 布局相同是什么意思?组件的结构?我有一些布局文件到 layout-normal-land 等...
    • 纵向和横向是否使用相同的布局?那么你可以避免在方向改变时保存状态。
    • 不,我为此视图使用了不同的 xml。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多