ViewPager中多个片段之间的通信对象

sab*_*ber 17 singleton android android-fragments android-viewpager

我有5个片段ViewPager用于逐步填充业务对象的几个字段,在每个步骤中将设置一些字段.我已经阅读了许多关于片段之间的通信的文章,但是我感觉不像其他人喜欢的方式,所以在考虑如何在我的情况下这样做之后,最后我开始考虑使用单件模型对象,所有片段都可以轻松访问到它的领域并按特定步骤填写它们.

由于我是android新手,我想听听专家关于使用单例而不是在片段之间传递数据(例如实现的接口)(看起来它太复杂且难以维护).任何建议都会有所帮助.

Jsc*_*ols 6

我不推荐全球单身人士.主要有两个原因:

  1. 根据定义,单例将您的应用程序限制为主业务对象的单个实例.如果您(或设计师或您老板的老板的老板)决定一次拥有多个ViewPage,那么您将不得不改变您的架构.
  2. "Android思维方式"是指您的用户可能会将您的应用置于后台,并在返回应用之前使用其他应用.如果系统决定在后台终止您的应用程序,那么您的单例内存对象将被销毁,您的用户将失去所有进度.正确的Android保存方式是将状态保存在Activity或Fragment中,将其妥善保存onSaveInstanceState()并恢复onCreate().

ViewPager中的所有片段都可以通过调用来获取对父Activity的引用getActivity().或者如果您的ViewPager在片段内,那么所有片段都可以通过调用来访问父片段getParentFragment().然后,您可以将结果转换为适当的类(或更好的接口),并进行方法调用以来回传递数据.在父Activity/Fragment中跟踪您的业务数据.这样,您就不需要全局单例

例如,

public class MyParentFragment extends Fragment {

  private String mPageOneData;
  private int mPageTwoData;
  private List<Date> mPageThreeData;

  public void setPageOneData(String data) {
    mPageOneData = data;
  }

  ...
}

public class PageOneFragment extends Fragment {

  private void sendDataToParent(String data) {
    Fragment f = getParentFragment();
    if (f != null && f instanceof MyParentFragment) {
      MyParentFragment parent = (MyParentFragment) f;
      f.setPageOneData(data);
    }
  }

}
Run Code Online (Sandbox Code Playgroud)


Vil*_*len 6

虽然单例方法似乎易于实现和理解,但这并不是达到所需要的最佳方式.一个原因是您的模型对象或您称之为业务对象的对象生活在您的活动的上下文之外,这可能会造成难以发现的错误.例如,如果系统创建了多个活动类实例,并且两者都保持对您的单例的引用.看看你如何失去对象的踪迹?

我要做的是

  1. 让我的模型对象实现Parcelable你会在开始时讨厌它但是一旦你习惯了它它将成为你模特的最好朋友
  2. 由于您的模型parcelable现在可以轻松地在片段,活动之间传递,甚至可以将其保存在共享首选项中.在传递parcelable片段或活动之间时,需要注意的一件重要事情就像是按值传递,即每次创建新实例时.
  3. 设置片段的参数或者如果它已经实例化,则获取参数并添加模型.这是一个例子:如果一个片段还没有激活:

    Bundle args = new Bundle(); args.putParcable("businessObject", yourBusinessObjectThatIsParcable); yourFragment.setArguments(args);

    除此以外: yourFragment.getArguments().putParcelable("businessObject", yourBusinessObjectThatIsParcable);

  4. 在你的片段中,也许在onCreateView方法中获取你的模型对象MyParcableObject mpo = (MyParcableObject)getArguments().getParcelable("businessObject")并使用它设置你想要的任何数据.

  5. 当您在按钮上单击或在onPause方法上完成对象的编辑时,更新了片段的参数 getArguments().putParcelable("businessObject", mpo);

  6. 在最后一页或最后一个片段您可以将对象传递给你的活动,在这里是如何做到这一点

即使它看起来很麻烦,但是你需要习惯作为Android开发人员.在模型实现时,您可以获得更多控制权parcelable.

另一种做你需要的方法是通过委托模式,但它主要用于回调,即使你也可以传递对象.