安卓训练-开始-使用 Fragment 构造动态 UI-与其他 Fragment 通信

与其他 Fragment 通信

上一课

下一课

这节课教你

  1. 定义接口
  2. 实现接口
  3. 发送消息到一个 Fragment

你还需要阅读

试试

下载示例

FragmentBasics.zip

为了重用 Fragment UI 组件,你应该把每个 Fragment 构造成定义自己的布局和行为的完整的自包含的模块化的组件。一旦你定义了这些可重用的 Fragment,你可以把它们关联到一个 Activity 并使用应用逻辑连接它们实现整体的组合 UI。

通常你希望一个 Fragment 与其他 Fragment 通信,例如根据用户事件改变内容。所有的 Fragment-to-Fragment 通信都通过关联的 Activity 完成。两个 Fragment 永远都不应该直接通信。

定义接口



为了允许一个 Fragment 与它的 Activity 通信,你可以在 Fragment 类中定义一个接口并在 Activity 中实现它。Fragment 在它的 onAttach() 生命周期方法中捕获接口实现,然后能调用接口的方法与 Activity 通信。

这里是一个 Fragment 到 Activity 通信的例子:

public class HeadlinesFragment extends ListFragment {
    OnHeadlineSelectedListener mCallback;

    // 容器 Activity 必须实现这个接口
    public interface OnHeadlineSelectedListener {
        public void onArticleSelected(int position);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        // 确保容器 activity 实现了回调接口。如果没有,抛出一个异常
        try {
            mCallback = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnHeadlineSelectedListener");
        }
    }

    ...
}

现在,这个 fragment 可以通过调用 OnHeadlineSelectedListener 接口的mCallback 实例的onArticleSelected()
方法 (或接口中的其他方法)发送消息给 activity了。

例如,当用户点击一个列表项时,fragment 中的下面的方法被调用。这个 fragment 使用回调接口发送事件给父 activity。

@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // 发送事件给宿主 activity
        mCallback.onArticleSelected(position);
    }

实现接口



为了接收 fragment 的事件回调,宿主 activity 必须实现这个 fragment 类中定义的接口。

例如,下面的 activity 实现了上面例子中的接口。

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // 用户在 HeadlinesFragment 中选中了文章标题
        // 在这里做些事情显示那篇文章
    }
}

发送消息到一个 Fragment



宿主 activity 使用 findFragmentById() 捕获Fragment
的实例,然后直接调用 fragment 的公有方法发送消息。

例如,想象下前面的 activity 可能包含另一个 fragment 用于显示上面的回调方法中返回的数据指定的项。在这种情况下,activity 可以把回调方法中收到的信息传给其他显示这个项的 fragment:

public static class MainActivity extends Activity
        implements HeadlinesFragment.OnHeadlineSelectedListener{
    ...

    public void onArticleSelected(int position) {
        // 用户在 HeadlinesFragment 中选中了文章标题
        // 在这里做些事情显示那篇文章

        ArticleFragment articleFrag = (ArticleFragment)
                getSupportFragmentManager().findFragmentById(R.id.article_fragment);

        if (articleFrag != null) {
            // 如果文章 fragment 可用,我们使用的是两栏布局...

            // 调用 ArticleFragment 的方法更新它的内容
            articleFrag.updateArticleView(position);
        } else {
            // 否则,我们使用的是单栏布局,必须切换 fragment...

            // 创建 fragment 并给它一个选中的文章的参数
            ArticleFragment newFragment = new ArticleFragment();
            Bundle args = new Bundle();
            args.putInt(ArticleFragment.ARG_POSITION, position);
            newFragment.setArguments(args);

            FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

            // 用这个 fragment 替换 fragment_container 视图中东西
            // 并把事务添加到返回栈,让用户可以导航回来
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // 提交事务
            transaction.commit();
        }
    }
}

上一课下一课

时间: 2024-10-11 16:41:06

安卓训练-开始-使用 Fragment 构造动态 UI-与其他 Fragment 通信的相关文章

Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

你可以把fragment看成是activity的模块化部分,它拥有自己的生命周期,接受它自己的输入事件,你可以在activity运行时添加或者删除它(有点像是一个"子activity",你可以在不同的activity中重用它).本课将向你展示如何使用Support Libaray继承 Fragment 类来让你的应用能够兼容正在运行Android 1.6的设备. 提示: 如果你决定你的应用需求的最低API级别是11或者更高,那么你不需要使用Support Library,你可以直接使用

Android学习路线(二十)运用Fragment构建动态UI

要在Android系统上创建一个动态或者多面板的用户界面,你需要将UI组件以及activity行为封装成模块,让它能够在你的activity中灵活地切换显示与隐藏.你可以使用Fragment类来创建这些模块,它们能够表现得有些像嵌套的activity,它们定义着自己的布局,管理自己的生命周期. 当一个fragment指定了它自己的布局,它可以在activity中和其他的fragment配置为不同的组合,这样就能够为不同的屏幕尺寸来修改你的布局配置(在小屏幕上一次展现一个fragment,而在大屏

Android学习路线(二十二)运用Fragment构建动态UI——构建一个灵活的UI

先占个位置,下次翻译 :p When designing your application to support a wide range of screen sizes, you can reuse your fragments in different layout configurations to optimize the user experience based on the available screen space. For example, on a handset devi

Android学习路线(二十三)运用Fragment构建动态UI——Fragment间通讯

先占个位置,下次翻译 :p In order to reuse the Fragment UI components, you should build each as a completely self-contained, modular component that defines its own layout and behavior. Once you have defined these reusable Fragments, you can associate them with

安卓训练-开始-使用 Fragment 构造动态 UI-构造灵活的 UI

构造灵活的 UI 上一课 下一课 这节课教你 在运行时添加 Fragment 到 Activity 替换 Fragment 你还需要阅读 Fragments 支持平板和掌上设备 试试 下载示例 FragmentBasics.zip 当你为支持大范围的屏幕尺寸设计你的应用时,你可以在不同的布局配置中重用你的 fragment,根据可用的屏幕空间优化用户体验. 例如,在一个手持设备上,单栏用户界面中每次只显示一个 fragment 可能比较合适.相反地,在一个平板上,有更宽的屏幕尺寸展示更多的信息给

9) 十分钟学会android--使用Fragment建立动态UI

为了在 Android 上为用户提供动态的.多窗口的交互体验,需要将 UI 组件和 Activity 操作封装成模块进行使用,这样我们就可以在 Activity 中对这些模块进行切入切出操作.可以用 Fragment 创建这些模块,Fragment 就像一个嵌套的 Activity,拥有自己的布局(Layout)并管理自己的生命周期. Fragment 定义了自己的布局后,它可以在 Activity 中与其他 Fragment 生成不同的组合,从而为不同的屏幕尺寸生成不同的布局(小屏幕一次也许只

Android学习路径(22)应用Fragment建立动态UI——构建一个灵活UI

当你设计你的应用来支持多个屏幕尺寸.你能够基于可用的屏幕空间通过在不同的布局上重用fragment来优化用户体验. 比如,在一个手机上.使用单面板(一次仅仅显示一个fragment)的用户体验更加合适.For example, on a handset device it might be appropriate to display just one fragment at a time for a single-pane user interface. 相反,你可能希望在一个可以展示很多其它

安卓训练-开始-使用 Fragment 构造动态 UI-创建 Fragment

创建 Fragment 上一课 下一课 这节课教你 创建一个 Fragment 类 使用 XML 添加 Fragment 到 Activity 你还需要阅读 Fragments 试试 下载示例 FragmentBasics.zip 你可以认为 fragment 是 activity 的模块化的部分,它有自己的生命周期,接收自己的输入事件,你可以在 activity 的运行过程中把它添加到 activity 或从 activity 中删除它(有点像一个你可以在不同 activity 中使用的"子

Android UI开发——使用Fragment构建灵活的桌面

当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏.10寸屏等等,Android开发文档给了我们参考,而且Google  IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里面不同的布局文件实现的.当设计应用程序,你可以在不同的布局结构中重复使用Fragment,以支持众多的屏幕尺寸,,在可用的屏幕空间上优化用户体验.例如在手持设备(如Nexus 4)上,一个屏显示一个Fragment,在更大屏(如Nexus 7)上可以使用多个Fr