文档章节

Fragment的回调机制

Carbenson
 Carbenson
发布于 2015/09/10 09:52
字数 642
阅读 128
收藏 1

为了尽量保证Fragment的独立性,Fragment类中不应该有访问其他Fragment和Activity中资源的代码,否则这个Fragment的独立性会被打破,不方便移植。

通常的做法是采用回调的方式实现非本Fragment的资源访问,需要访问外部资源的Fragment必须提供相应的接口,并OnAttach方法中对窗口类对象进行转化,而使用该Fragment的窗口必须实现该接口,大致思路如此。

请求访问外部资源的Fragment

package mobile.android.fragment.callback;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

//Button的单击事件方法在此Fragment里面实现
public class TopFragment extends Fragment {
	private OnTopButtonClickedListener listener;

	// 提供回调方法的接口,通常嵌入该fragment的窗口类来实现该接口
	public interface OnTopButtonClickedListener {
		// 回调方法
		public void onClick(String name);
	}

	@Override
	public void onAttach(Activity activity) {
		// 嵌入该fragment的窗口类必须实现该接口,否则无法将该窗口类对象转化成该接口对象,也就无法调用回调方法
		if (getActivity() instanceof OnTopButtonClickedListener) {
			listener = (OnTopButtonClickedListener) getActivity();//转化
		}
		super.onAttach(activity);
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.top_fragment, null);
		view.setOnClickListener(new OnClickListener() {
			//匿名内部类
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				if (listener != null) {
					//调用回调方法
					listener.onClick("Top Fragment Demo");
				}
			}
		});
		return view;
	}

}

实现接口的窗口类

package mobile.android.fragment.callback;

import mobile.android.fragment.callback.TopFragment.OnTopButtonClickedListener;
import android.app.Activity;
import android.os.Bundle;
//必须实现OnTopButtonClickedListener接口
public class FragmentCallbackActivity extends Activity implements
		OnTopButtonClickedListener
{

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_fragment_callback);
	}
	//实现回调方法
	@Override
	public void onClick(String name)
	{
		//通过tag获取BottomFragment对象
		BottomFragment fragment = (BottomFragment) getFragmentManager()
				.findFragmentByTag("bottom_fragment");
		fragment.updateText("onClick:" + name);

	}

}

被访问资源所在的Fragment

package mobile.android.fragment.callback;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;

public class BottomFragment extends Fragment
{

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState)
	{
		View view = inflater
				.inflate(R.layout.bottom_fragment, container, false);
		//其实根视图就是一个EditText
		return view;
	}
	   
	public void updateText(String value)
	{
		EditText editText = (EditText)getView();
		editText.setText(value);
	}

}

看来,Activity是负责处理涉及多个Fragment资源信息交互的承担者,好处就是Activity可以根据实际需要给出具体的操作,在修改的时候直接修改Activity里面的回调方法代码,无需修改Fragment,这样有效地保证Fragment的独立性,值得注意的一点是,提供接口的Fragment必须在OnAttach方法里面进行对象类型的转化,例如此处的

@Override
	public void onAttach(Activity activity) {
		// 嵌入该fragment的窗口类必须实现该接口,否则无法将该窗口类对象转化成该接口对象,也就无法调用回调方法
		if (getActivity() instanceof OnTopButtonClickedListener) {
			listener = (OnTopButtonClickedListener) getActivity();//转化
		}
		super.onAttach(activity);
	}


© 著作权归作者所有

Carbenson
粉丝 19
博文 271
码字总数 84864
作品 0
广州
程序员
私信 提问
Activity 与 Fragment 之间相互通信

欢迎转载,但请保留文章原始出处→→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4000390.html 联系方式:smyhvae@163.com 【正文】 一、接口回...

iSnowFlake
2015/11/19
3.9K
1
带你从源码理解Fragment机制

相信大家平时用到很多Fragment, 手机平板的代码共用,各种东西的复用,用Fragment也很方便。如今Fragment遍布在我们的APP里面,今天此文将讲解Activity是如何Fragment机制联动的,以及各个生...

Anderson大码渣
2018/05/20
0
0
android-如何通过接口回调来解决Fragment之间的交互

由于在android的丝线机制综fragment和acitivty会被分别实例化为两个不相干的对象,他们之间的联系由activity的一个成员对象FragmntManager来维护,Fragment实例化后到activity中的fragmentM...

pointerException
2015/07/29
7.4K
3
Android Fragment---与Activity生命周期的协调

拥有Fragment的Activity的生命周期直接影响了其中的Fragment的生命周期,这样,针对Activity的每一个生命周期的回调都会有一个类似的针对Fragment的回调。例如,当Activity收到onPause()回调...

长平狐
2012/10/16
1K
0
Android Loader 机制,让你的数据加载更加高效

前言 在 Android 中,任何耗时的操作都不能放在 UI 线程中,所以耗时的操作都需要使用异步加载来实现。其实,加载耗时数据的常用方式其实也挺多的,就让我们来看一下 1、Thread + Handler Th...

developerHaoz
2017/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【Go专家编程】defer这里有个坑

前言 项目中,有时为了让程序更健壮,也即不panic,我们或许会使用recover()来接收异常并处理。 比如以下代码: func NoPanic() {if err := recover(); err != nil {fmt.Println("Recov...

恋恋美食
20分钟前
2
0
20190920笔记

扩展: bashrc和bash_profile http://ask.apelearn.com/question/7719 http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html echo 颜色 http://www.cnblogs.com/lr-ting/archi......

徐-锐
35分钟前
1
0
Shiro整合Redis代码解读

1. shiro默认使用的MemoryConstrainedCacheManager创建MapCache来保存缓存数据。manager和cache对象之间的关系可以参考笔者的另一篇文章,Springboot Redis详解。 2. shiro整合Redis的关键就...

sunranhou
59分钟前
4
0
关闭服务

题目要求 在centos6系统里,我们可以使用ntsysv关闭不需要开机启动的服务,当然也可以使用chkconfig工具来实现。 写一个shell脚本,用chkconfig工具把不常用的服务关闭。脚本需要写成交互式的...

wzb88
今天
6
0
面试官:兄弟,说说 Spring Cloud 的核心架构原理吧

最近在补一些分布式系列的面试内容,提前几个月做做准备吧,你们懂的,也跟大家分享分享。现在分布式系统基本上都是标配了,如果你现在还在玩儿单机,没有接触过这些东西的话,权当是为你打开...

咪咪家的汪汪
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部