将初始数据提供给片段的正确方法?

War*_*zit 60 android android-fragments

所以我已经知道我需要一个空的构造函数,以便我的片段不会因重新初始化而崩溃.我的问题是我在初始化时使用了我的片段的数据列表(至少其中一些).那么用数据列表启动新片段的好方法是什么.我是否应该在OnCreate()中创建一个getData方法,该方法从其他来源获取数据或者什么是正确的方法?

由于我有大量数据,因此用数据提供数据包确实不是一个很好的方法.

那么让我们来看一个案例(我理解它的方式更好).

当用户单击按钮时,片段将启动.我以前用这种方式创建一个新片段:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.replace(R.id.center_container, new DetailFragment(item));
    fragmentTransaction.addToBackStack(DETAIL_TAG);

    fragmentTransaction.commit();
Run Code Online (Sandbox Code Playgroud)

然后在我的片段中:

public DetailFragment(EventItem item) {
    mItem = item;
    mPlaces = Database.getContainerPlaces(getActivity()).getValidItems();
}
Run Code Online (Sandbox Code Playgroud)

我无法将所有数据都提供给捆绑包,因此无法正常工作.所以我该怎么做?

答:我应该用空构造函数初始化片段,然后从我的活动中使用setter直接在片段中设置数据吗?但是,如果用户按下home,android会关闭片段并且用户稍后返回,我不会丢失数据吗?

B:我应该用工厂模式初始化片段并调用setRetainInstance(true),给片段一个标识数据的密钥,然后让片段从某个第三个源获取onCreateView中所需的数据?

C:我应该只创建一个空构造函数然后在onCreate()中获取片段所需的数据吗?

应该注意的是,应用程序是纵向锁定的,因此问题主要在于Android关闭和用户重新启动时维护对象.

Com*_*are 73

那么用数据列表启动新片段的好方法是什么.

使用工厂模式和"参数" Bundle,例如:

package com.commonsware.empublite;

import android.os.Bundle;

public class SimpleContentFragment extends AbstractContentFragment {
  private static final String KEY_FILE="file";

  protected static SimpleContentFragment newInstance(String file) {
    SimpleContentFragment f=new SimpleContentFragment();

    Bundle args=new Bundle();

    args.putString(KEY_FILE, file);
    f.setArguments(args);

    return(f);
  }

  @Override
  String getPage() {
    return(getArguments().getString(KEY_FILE));
  }
}
Run Code Online (Sandbox Code Playgroud)

如果你保留你的片段实例,你应该能够使用普通的setter将东西放入数据成员中."参数" Bundle作为配置更改的一部分保留,因此对于非保留实例,这是确保在用户旋转屏幕时保留设置数据的方法等.

  • @Warpzit:是的,片段会从托管活动中收到任何识别信息,它需要知道从模型中获取什么.其中一些可能是在创建时提供的.如果有可能在现有片段中更新数据的情况,那就是`setRetainInstance()`开始真正方便的地方...... :-) (2认同)
  • @CommonsWare我不认为这个答案是完整的:文件名是否指向一个文件,其中数据列表实际上是序列化的?工厂模式是否用于检索此列表.在当前的代码中,我只看到Singleton的实现.也许答案的建议是保留单个片段实例,然后使用setter来获取其他数据? (2认同)