博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fragment之间的通信
阅读量:6252 次
发布时间:2019-06-22

本文共 3135 字,大约阅读时间需要 10 分钟。

在本节中,你会学到

1、定义接口

2、实现接口

3、将消息传递给fragment

为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让fragment的自包含和模块化。一旦你定义了这些可重用的 Fragment,你可以通过Activity将它们关联起来并通过程序的逻辑代码将他们连接起来以实现整体组合的UI。

你会经常想要一个fragment与另一个fragment通信,例如基于用户事件改变fragment中的内容。所有fragment质检单额通信都是通过Activity关联起来的。两个fragment之间不应该直接进行通信。

定义接口

为了允许fragment和它的Activity通信,你应该fragment类中定义一个接口并在Activity中实现它。Fragment在 onAttach()回调函数中获取接口的具体实现的对象。后面,fragment就可以调用接口中的方法实现与Activity的通信。

下面是一个Fragment一Activity通信的例子:

// 用来存放fragment的Activtiy必须实现这个接口    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中的方法将会在用户点击一个List item的时候被调用。这个fragment使用回调接口将时间传递给父Activtity。

@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可以通过调用方法获取Fragment实例,然后直接调用Fragment的公有方法,将消息传递给Fragment。

例如,想象一下,之前讲过的Activity可能包含有其他的fragment,而这些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) {            // 如果 article frag 不为空,那么我们在同时显示两个fragmnet的布局中...            // 调用ArticleFragment中的方法去更新它的内容            articleFrag.updateArticleView(position);        } else {            // 否则,我们就是在仅包含一个fragment的布局中并需要交换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中的东西            // 并添加事务到back stack中以便用户可以回退到之前的状态            transaction.replace(R.id.fragment_container, newFragment);            transaction.addToBackStack(null);            // 提交事务            transaction.commit();        }    }}

转载地址:http://rojsa.baihongyu.com/

你可能感兴趣的文章
在接口测试中怎么处理开发是否提供接口文档的总结
查看>>
HDU_1086 You can Solve a Geometry Problem too(几何题)
查看>>
在新窗口中打开链接 javascript
查看>>
动物产生式识别系统
查看>>
Jquery UI - DatePicker 在Dialog中无法自动隐藏的解决思路
查看>>
Docker Swarm 让你事半功倍
查看>>
string.Format字符串格式说明
查看>>
POJ 3518 Prime Gap(素数)
查看>>
Python3.6的组件numpy的安装
查看>>
Python的编码问题
查看>>
Javascript 打开模式窗口
查看>>
【听课笔记】MIT领导力课程笔记:施乐前CEO Anne——在火线上得到的经验
查看>>
【Oracle】手工配置Oracle 10G Enterprise Manager【转载】
查看>>
oracle用户状态
查看>>
来玩Play框架01 简介
查看>>
[转]IC行业的牛人
查看>>
linux 16进制 产看文件
查看>>
javaScript事件(四)event的公共成员(属性和方法)
查看>>
Oracle之比较NVARCHAR2字符串
查看>>
linux系统常用命令
查看>>