Fragment的回调机制

为了尽量保证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);
	}
时间: 2024-08-10 11:26:10

Fragment的回调机制的相关文章

模拟QQ侧滑控件 实现三种界面切换效果(知识点:回调机制,解析网络json数据,fragment用法等)。

需要用到的lib包 :解析json  gson包,从网络地址解析json数据成String字符串的异步网络解析工具AsyncHttpClient等 下载地址:点击下载 Xlistview 下拉上拉第三方框架  点击下载 侧滑菜单的lib  点击下载 1 package com.lixu.testjsonall; 2 3 import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; 4 import com.jeremyfeinstein.slid

Java接口回调机制

一.前言 最近在看android Fragment与Activity进行数据传递的部分,看到了接口回调的内容,今天来总结一下. 二.回调的含义和用途 1.什么是回调? 一般来说,模块之间都存在一定的调用关系,从调用方式上看,可以分为三类同步调用.异步调用和回调.同步调用是一种阻塞式调用,即在函数A的函数体里通过书写函数B的函数名来调用之,使内存中对应函数B的代码得以执行.异步调用是一种类似消息或事件的机制解决了同步阻塞的问题,例如A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B

Java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1 class A中包含一个class B的引用b ——背景2 class B有一个参数为call

java中的回调机制的理解(小例子)

这样的解释似乎还是比较难懂,这里举个简单的例子,程序员A写了一段程序(程序a),其中预留有回调函数接口,并封装好了该程序.程序员B要让a调用自己的程序b中的一个方法,于是,他通过a中的接口回调自己b中的方法.目的达到.在C/C++中,要用回调函数,被掉函数需要告诉调用者自己的指针地址,但在JAVA中没有指针,怎么办?我们可以通过接口(interface)来实现定义回调函数. 正常情况下开发人员使用已经定义好的API,这个过程叫Call.但是有时这样不能满足需求,就需要程序员注册自己的程序,然后让

java回调机制(写的很好)

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback——背景1 class A中包含一个class B的引用b ——背景2 class B有一个参数为call

JAVA回调机制(CallBack)详解

序言 最近学习java,接触到了回调机制(CallBack).初识时感觉比较混乱,而且在网上搜索到的相关的讲解,要么一言带过,要么说的比较单纯的像是给CallBack做了一个定义.当然了,我在理解了回调之后,再去看网上的各种讲解,确实没什么问题.但是,对于初学的我来说,缺了一个循序渐进的过程.此处,将我对回调机制的个人理解,按照由浅到深的顺序描述一下,如有不妥之处,望不吝赐教! 开始之前,先想象一个场景:幼稚园的小朋友刚刚学习了10以内的加法. 第1章. 故事的缘起 幼师在黑板上写一个式子 “1

一个经典例子让你彻彻底底理解java回调机制

以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式: Class A实现接口CallBack callback--背景1 class A中包含一个class B的引用b --背景2 class B有一个参数为call

Java回调机制解析

模块之间总是存在着一定的接口,从接口调用方式上看,可以分为三类:同步调用.回调和异步调用.同步调用是一种阻塞式调用,也是我们在写程序中经常使用的:回调是一种双向的调用模式,也就是说,被调用的接口被调用的同时也会调用对方的接口,这句话可能有点绕,等文章后面举例说明:异步调用是一种类似消息或事件的机制,解决了同步阻塞的问题,举例来讲:A通知B后,他们各走各的路,互不影响,不用像同步调用那样,A通知B后,非得等到B走完后,A才继续走.回调是异步的基本,因此下面着重说回调机制. 我们暂且不讨论回调的一些

接口_ _接口回调机制

在Android中到处可见接口回调机制,尤其是UI事件处理方面,本文给大家介绍android接口回调机制,涉及到android接口回调相关知识,对本文感兴趣的朋友可以参考下本篇文章 在使用接口回调的时候发现了一个经常犯的错误,就是回调函数里面的实现有可能是用多线程或者是异步任务去做的,这就会导致我们期望函数回调完毕去返回一个主函数的结果,实际发现是行不通的,因为如果回调是多线程的话你是无法和主函数同步的,也就是返回的数据是错误的,这是非常隐秘的一个错误.那有什么好的方法去实现数据的线性传递呢?先