0

我想知道为什么通过容器 Activity 进行通信的片段被称为可重用的。

来自: http: //developer.android.com/guide/components/fragments.html我知道:

您应该将每个片段设计为模块化和可重用的活动组件。也就是说,因为每个片段都通过自己的生命周期回调定义了自己的布局和自己的行为,所以您可以在多个活动中包含一个片段,因此您应该设计重用并避免直接从另一个片段操作一个片段。

举个例子;我有一个DateSetFragment包含两个按钮;第一个按钮触发TimePickerDialog(FragmentDialog),允许用户选择一个小时,第二个按钮(FragmentDialog)DatePickerDialog允许用户选择一天。最后收集的数据应该被发送回DateSetFragment.

根据: http: //developer.android.com/training/basics/fragments/communicating.html

所有 Fragment 到 Fragment 的通信都是通过关联的 Activity 完成的。两个 Fragment 永远不应该直接通信。

片段之间的通信应该通过容器活动的接口来完成。鉴于我应该将收集到的数据从两个片段对话框发送到容器活动,然后从活动返回到DateSetFragment. 我看不出这如何DateSetFragment以任何方式使我的可重用和模块化。这样做我必须在我的容器 Activity 中实现片段接口和一些关键逻辑,使其与之连接。

问题是; 如果 Fragment Dialogs 直接DateSetFragment

4

1 回答 1

0

它是“模块化的”,因为这些接口已经很好地定义并由托管活动明确实现。

无论您将该片段放入何处,如果活动实现了片段事件定义的回调接口,则该活动可以根据片段附加的环境选择要执行的操作。

例子,

DatePickerFragment extends Fragment {

    public interface DatePickerFragmentEventListener { 
        public void onDateSelected(DateTime dt);
    }
}



Activity1 extends Activity implements DatePickerFragmentEventListener {

    DatePickerFragment mDatePickerFragment;
    OtherFragment mFragment2;

    @Override
    public void onDateSelected(DateTime dt) {
        mFragment2.setSomeViewsText(dt.toString());
    }

}


Activity2 extends Activity implements DatePickerFragmentEventListener {

    DatePickerFragment mDatePickerFragment;

    @Override
    public void onDateSelected(DateTime dt) {
        SharedPrefClient c = SharedPrefClient.getInstance();

        c.setExpirationDateTime(dt);
    }

}

我有一个 dateTimePickerFragment (或其他),在一个活动中我有 2 个片段,当您更改选择器上的日期时,我想更新另一个片段的文本视图以显示该日期。在另一个活动中,我可能会使用完全相同的回调将所选日期写入 SharedPreferences。

关键是 Fragment 是一个包含的 UI 交互片段,并且某些事件会通知封闭的 Activity 刚刚发生的事情,以便 Activity 指示对 Fragment 的操作结果对其他 Fragment 或应用程序本身。没有理由为每种情况实现自定义片段。

于 2013-09-20T18:03:16.560 回答