另一个片段沟通

时间:2017-07-29 06:14:05

标签: android android-fragments

这里有很多关于片段通信的问题,但它们通常是关于从活动中获取数据并将数据发送回活动的问题,通常从片段开始。 但是我想知道什么是将数据从活动发送到片段的最佳方法,当你在创建片段时无法做到这一点?为了澄清,让我们假设一个应用程序有2个片段,可以使用(不一定)某些数据来改善用户体验,但获取这些数据的成本很高。因此,在主要活动中使用LoaderAsyncTask时,在活动中获取此数据,同时自行创建碎片。现在,当数据在Activity中异步准备时,我们需要将此数据发送到Fragments。对此最好的方法是什么?我想到了这样做的方法,我想知道这种方法是否有任何问题。

1-In片段我们使用onAttach将片段发送到活动并检查是否已读取任何数据:

@Override
public void onAttach (Activity activity) {
    MyActivity act = (MyActivity)activity;
    act.addFragment(this);
    Data data = act.getData();
    if (data != null) {
        setAdditionData(data)
    }
}

2 - 并且在活动中将WeakReference存储到片段:

private ArrayList<WeakReference<Fragment>> mFragments = new ArrayList<>();
...
public void addFragment(Fragment frag) {
    WeakReference<Fragment> f = new WeakReference<Fragment>(frag);
    mFragments.add(f);
}

public Data getData() {
    return mData;
}

public void updateFragmentsData() {
    for (Iterator<WeakReference<Fragment>> iterator = mFragments.iterator(); iterator.hasNext();) {
        WeakReference<Fragment> wf = iterator.next();
        Fragment f = wf.get();
        if (f != null) {
            f.setAdditionData(mData);
        } else {
            iterator.remove();
        }
    }
}

现在,当片段附加时,它会将自身添加到活动中的片段列表中,并检查数据是否已准备就绪,如果准备就绪,它将使用该数据。另一方面,当数据在活动中异步准备时,它可以调用updateFragmentsData()来更新所有片段数据。

我想知道这种方法是否正确或在某些情况下可能不正确?任何的想法?是否有更好的方法来通知主要活动中的碎片?

顺便说一下,是否可以使用Handler / Message在片段之间进行通信?作为另一种方法?

最好的问候

1 个答案:

答案 0 :(得分:0)

我可以想到三种方式。

  1. 使用听众。在活动中编写接口以将其用作侦听器。该片段实现了接口,并在适当的时候注册和注销为侦听器。(例如在onCreateView和onDestroyView上)。
  2. 这是我的最爱。我希望DataBinding越来越受欢迎,它可以用来解决这个问题。假设您为片段布局定义了特定模型。现在,您在模型中使用ObservableFields。将此模型传递给数据绑定变量。现在从活动或片段本身更改此对象,更改将反映在视图中。
  3. 新推出的ViewModels。我将在下一个项目中使用它们。