您的位置:首页 > 其它

Fragment Activity之间的通信方法之一

2015-09-07 11:23 267 查看

一、本章主要是讲Fragment中通过接口方式实现通信

前言:Avtivity、Fragment之间通信方式当然还有别的方法、例如:EventBus就是一个非常之强大的框架。这里只是记录一下自己这次遇到的情况!

1、定义接口

为了允许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);
}


2、实现接口

为了接收从fragment传递过来的事件回调,宿主Activity必须实现定义在fragment类中的接口。

例如,下面的activity实现了上个例子中的接口。
public static class MainActivity extends Activity
implements HeadlinesFragment.OnHeadlineSelectedListener{
...

public void onArticleSelected(int position) {
// 用户选择了HeadlinesFragment中的头标题后
// 做一些业务操作
}
}


3、将消息传递给Fragment

宿主Activity可以通过调用findFragmentById()方法获取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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: