为什么通过容器Activity进行通信的片段被称为可重用?

时间:2013-09-20 17:48:48

标签: android interface android-fragments

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

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

  

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

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

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

  

所有片段到片段的通信都是通过关联的方式完成的   活动。两个碎片永远不应该直接沟通。

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

问题是;如果Fragment Dialogs直接与DateSetFragment

通信,在这种情况下是不是错了

1 个答案:

答案 0 :(得分: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。

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