上一篇我们讲到与Fragment有关的常用函数,既然Fragment被称为是“小Activity”,现在我们来讲一下Fragment如何与Acitivity通信。如果上一篇还有不懂得,可以再看一下。传送门

  Fragment与Activity通信的方式如下:

  一、通过初始化函数提供

    1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据;

     2.在Fragment中,在onAttach()函数中通过调用getArguments()获得一个Bundle对象,从而获取我们提供的数据。

  二、创建回调接口

    比如说:新闻浏览情境下,共有两个Fragment,一个是用来显示新闻标题;另外一个用来显示新闻内容。当我们点击新闻标题的时候,新闻的内容就显示到另外一个Fragment当中了。下面我们就来通过按下Fragment1中的button来传递一个消息到Fragment2中。

    首先我们要做的是,在Fragment1中创建一个回调接口,并且在Activity中重写他的方法,传递信息给Fragment2(举一反三:我们也可以传递给其他的Fragment)。

    下面我给出Fragment1的代码:

 package com.example.fragment;

 import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup; import com.example.fragmentdemo.R; public class Fragment1 extends Fragment { private static final String TAG = "FragmentDemo";
private OnButtonClickListener mListener; /**
* 这里我们创建一个回调接口
*
* @author Myp
*
*/
public interface OnButtonClickListener {
public void onButtonClicked();
} @Override
public void onAttach(Activity activity) {
Log.v(TAG, "Fragment1 onAttach");
Bundle args = getArguments();
if (null != args) {
/*
* 在这里我们可以将从Acivity收到的数据保存起来,并且显示到Fragment当中。
*/
Log.d(TAG,
"Fragment1 Get data from activity "
+ args.getString("hello"));
} try {
mListener = (OnButtonClickListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnButtonClickListener");
}
super.onAttach(activity);
} @Override
public void onInflate(Activity activity, AttributeSet attrs,
Bundle savedInstanceState) {
Log.d(TAG, "onInflate");
super.onInflate(activity, attrs, savedInstanceState);
} @Override
public void onCreate(Bundle savedInstanceState) {
Log.v(TAG, "Fragment1 onCreate");
super.onCreate(savedInstanceState);
} @Override
public void onDestroy() {
Log.v(TAG, "Fragment1 onDestroy");
super.onDestroy();
} @Override
public void onResume() {
Log.v(TAG, "Fragment1 onResume");
super.onResume();
} @Override
public void onStart() {
Log.v(TAG, "Fragment1 onStart");
super.onStart();
} @Override
public void onDetach() {
Log.v(TAG, "Fragment1 onDetach");
super.onDetach();
} @Override
public void onPause() {
Log.v(TAG, "Fragment1 onPause");
super.onPause();
} @Override
public void onStop() {
Log.v(TAG, "Fragment1 onStop");
super.onStop();
} @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
Log.v(TAG, "Fragment1 onCreateView");
View view = inflater.inflate(R.layout.fragment1, container, false);
// 为button注册事件,并且调用回调接口,将信息返回给上层
view.findViewById(R.id.fragment1_btn).setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
mListener.onButtonClicked();
}
});
return view;
} @Override
public void onDestroyView() {
Log.v(TAG, "Fragment1 onDestroyView");
super.onDestroyView();
} @Override
public void onActivityCreated(Bundle savedInstanceState) {
Log.v(TAG, "Fragment1 onActivityCreated");
super.onActivityCreated(savedInstanceState);
} }

     

    1.创建回调接口;

    2.为了确保宿主activity实现这个接口,fragment1的onAttach() 方法中通过将传入的activity强制类型转换,实例化一个OnButtonClickListener对象;

    3.注册Button的Click事件,并在事件中调用回调方法。

    然后我给出Activity的代码:

 package com.example.fragmentdemo;

 import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.widget.TextView; import com.example.fragment.Fragment1;
import com.example.fragment.Fragment1.OnButtonClickListener;
import com.example.fragment.Fragment2; @SuppressLint("Recycle")
public class MainActivity extends FragmentActivity implements
OnButtonClickListener { private static final String TAG = "FragmentDemo";
private Fragment1 fragment1;
private Fragment2 fragment2; @Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragment1 = new Fragment1();
fragment2 = new Fragment2();
addFragment1();
addFragment2();
} private void addFragment1() {
Bundle args = new Bundle();
args.putString("hello", "Hello Fragment1");
fragment1.setArguments(args);
Log.i(TAG, "create Fragment1");
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.add(R.id.one, fragment1);
transaction.addToBackStack(null);
transaction.commit();
} private void addFragment2() {
Bundle args = new Bundle();
args.putString("hello", "Hello Fragment2");
fragment2.setArguments(args);
Log.i(TAG, "create Fragment2");
FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
transaction.replace(R.id.two, fragment2);
transaction.addToBackStack(null);
transaction.commit();
} @Override
public void onAttachFragment(Fragment fragment) {
Log.i(TAG, "onAttachFragment");
super.onAttachFragment(fragment);
} @Override
protected void onDestroy() {
Log.i(TAG, "onDestroy");
super.onDestroy();
} @Override
protected void onPause() {
Log.i(TAG, "onPause");
super.onPause();
} @Override
protected void onResume() {
Log.i(TAG, "onResume");
super.onResume();
} @Override
protected void onStart() {
Log.i(TAG, "onStart");
super.onStart();
} @Override
protected void onStop() {
Log.i(TAG, "onStop");
super.onStop();
} @Override
protected void onRestart() {
Log.i(TAG, "onRestart");
super.onRestart();
} @Override
public void onButtonClicked() {
Log.i(TAG, "onButtonClicked");
TextView tv = (TextView) fragment1.getActivity().findViewById(
R.id.fragment2_tv);
tv.setText(tv.getText() + "\n从Fragment1收到数据!");
}
}

    1.通过implements实现回调接口;

    2.重写回调方法,然后向Fragment2传递数据。

  三、源码下载

    点我下载,下载源码导入工程就可以使用了!

  接下来可能会介绍一下Fragment的动画效果,有兴趣的可以关注一下。我的CSDN博客:http://blog.csdn.net/u010049692/article/details/38979607

【Android开发】之Fragment与Acitvity通信的更多相关文章

  1. android开发中fragment获取context

    在用到fragment时无法使用.this来指定当前context内容,android开发中fragment获取context,可以使用getActivity().getApplicationCont ...

  2. Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml

    Android开发:碎片Fragment完全解析   为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像 Activi ...

  3. Android 开发 之 Fragment 详解

    本文转载于 : http://blog.csdn.net/shulianghan/article/details/38064191 本博客代码地址 : -- 单一 Fragment 示例 : http ...

  4. Fragment与Acitvity通信

    Fragment与Activity通信的方式如下: 一.通过初始化函数提供 1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为F ...

  5. Android开发:图文分析 Handler通信机制 的工作原理

    前言 在Android开发的多线程应用场景中,Handler机制十分常用 下面,将图文详解 Handler机制 的工作原理 目录 1. 定义 一套 Android 消息传递机制 2. 作用 在多线程的 ...

  6. Android开发学习—— Fragment

    #Fragment* 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容* 生命周期方法跟Activity一致,可以理解把其为就是一个Activity* 定义布局文件作 ...

  7. Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml(转)

    注明:这个转的,见谅未能标明原始出处 我们都知道,Android上的界面展示都是通过Activity实现的,Activity实在是太常用了,我相信大家都已经非常熟悉了,这里就不再赘述. 但是Activ ...

  8. android 开发 碎片Fragment布局例子(用按键切换碎片布局)

    实现思路: 1.写一个父类布局,里面写一个按键和一个帧布局(用于给Fragment布局后续替代) 2.写3个子布局,并且在写3个class继承Fragment布局 3.在MainActivity的cl ...

  9. android开发(41) Fragment中使用POP_BACK_STACK_INCLUSIVE达到一次跳转到栈底。类似Activity的 采用FLAG_ACTIVITY_CLEAR_TOP

    需求场景: 在开发中遇到下面这样场景: 1.创建 Fragment A 显示.  这时栈的结构是: .Fragment A 2.创建 Fragment B 并 显示.  从下到上看,这时栈的结构是: ...

随机推荐

  1. A1083. List Grades

    Given a list of N student records with name, ID and grade. You are supposed to sort the records with ...

  2. 【CH1602】最大异或和 trie+贪心

    题目大意:给定 N 个数,求这 N 个数中任选两个数进行异或运算,求最大的异或和是多少. 一个 int 类型的整数,可以看作一个长度为32位的字符串,异或运算不像加法,最大值不一定是由两个较大值得到. ...

  3. VB: 再次使用的体会

    放下VB已经有7.8年的时候了. 记得在上学的时候,一直迷恋着它,学了三年的VB,写了不少小软件. 到了工作之后,转到JAVA后,就一直没用VB. 这次的项目由于与系统的相关性高以及安装文件的大小有限 ...

  4. XML模块(二十四)

    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代, 大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统 ...

  5. springboot集成druid连接池

    使用druid连接池主要有几步: 1.添加jar和依赖 <groupId>org.mybatis.spring.boot</groupId> <artifactId> ...

  6. Prometheus jvm_exporter监控zookeeper

    Zookeeper Prometheus 监控zookeeper使用jvm_exporter来采集数据,jvm_exporter是一个可以配置抓取和暴露JMX目标的mBeans的收集器. 下载java ...

  7. js通用绑定事件函数

  8. 在 github 新建一个文件夹

    创建新文件的时候名字后面加个斜杠(/)就可以了.

  9. .NET MVC中的数据验证

    一  概述 关于数据验证和数据注解,是任何软件系统不可小觑的必要模块,主要作用是为了保证数据安全性.防止漏洞注入和网络攻击.从数据验证的验证方式来说,我们一般分为客户端验证和服务端验证(或者两种方式相 ...

  10. python多进程那点事儿【multiprocessing库】

    前言:项目中有个需求需要对产品的日志处理,按照产品中日志的某些字段,对日志进行再次划分.比如产品的日志中含有字段id,tag=1,现在需要把tag是基数的放到一个文件中,tag是偶数的放入一个文件中. ...