【Android开发】之Fragment与Acitvity通信

 

  上一篇我们讲到与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的代码:

  1 package com.example.fragment;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.support.v4.app.Fragment;
  6 import android.util.AttributeSet;
  7 import android.util.Log;
  8 import android.view.LayoutInflater;
  9 import android.view.View;
 10 import android.view.View.OnClickListener;
 11 import android.view.ViewGroup;
 12 
 13 import com.example.fragmentdemo.R;
 14 
 15 public class Fragment1 extends Fragment {
 16 
 17     private static final String TAG = "FragmentDemo";
 18     private OnButtonClickListener mListener;
 19 
 20     /**
 21      * 这里我们创建一个回调接口
 22      * 
 23      * @author Myp
 24      * 
 25      */
 26     public interface OnButtonClickListener {
 27         public void onButtonClicked();
 28     }
 29 
 30     @Override
 31     public void onAttach(Activity activity) {
 32         Log.v(TAG, "Fragment1 onAttach");
 33         Bundle args = getArguments();
 34         if (null != args) {
 35             /*
 36              * 在这里我们可以将从Acivity收到的数据保存起来,并且显示到Fragment当中。
 37              */
 38             Log.d(TAG,
 39                     "Fragment1 Get data from activity "
 40                             + args.getString("hello"));
 41         }
 42 
 43         try {
 44             mListener = (OnButtonClickListener) activity;
 45         } catch (ClassCastException e) {
 46             throw new ClassCastException(activity.toString()
 47                     + " must implement OnButtonClickListener");
 48         }
 49         super.onAttach(activity);
 50     }
 51 
 52     @Override
 53     public void onInflate(Activity activity, AttributeSet attrs,
 54             Bundle savedInstanceState) {
 55         Log.d(TAG, "onInflate");
 56         super.onInflate(activity, attrs, savedInstanceState);
 57     }
 58 
 59     @Override
 60     public void onCreate(Bundle savedInstanceState) {
 61         Log.v(TAG, "Fragment1 onCreate");
 62         super.onCreate(savedInstanceState);
 63     }
 64 
 65     @Override
 66     public void onDestroy() {
 67         Log.v(TAG, "Fragment1 onDestroy");
 68         super.onDestroy();
 69     }
 70 
 71     @Override
 72     public void onResume() {
 73         Log.v(TAG, "Fragment1 onResume");
 74         super.onResume();
 75     }
 76 
 77     @Override
 78     public void onStart() {
 79         Log.v(TAG, "Fragment1 onStart");
 80         super.onStart();
 81     }
 82 
 83     @Override
 84     public void onDetach() {
 85         Log.v(TAG, "Fragment1 onDetach");
 86         super.onDetach();
 87     }
 88 
 89     @Override
 90     public void onPause() {
 91         Log.v(TAG, "Fragment1 onPause");
 92         super.onPause();
 93     }
 94 
 95     @Override
 96     public void onStop() {
 97         Log.v(TAG, "Fragment1 onStop");
 98         super.onStop();
 99     }
100 
101     @Override
102     public View onCreateView(LayoutInflater inflater, ViewGroup container,
103             Bundle savedInstanceState) {
104         Log.v(TAG, "Fragment1 onCreateView");
105         View view = inflater.inflate(R.layout.fragment1, container, false);
106         // 为button注册事件,并且调用回调接口,将信息返回给上层
107         view.findViewById(R.id.fragment1_btn).setOnClickListener(
108                 new OnClickListener() {
109                     @Override
110                     public void onClick(View v) {
111                         mListener.onButtonClicked();
112                     }
113                 });
114         return view;
115     }
116 
117     @Override
118     public void onDestroyView() {
119         Log.v(TAG, "Fragment1 onDestroyView");
120         super.onDestroyView();
121     }
122 
123     @Override
124     public void onActivityCreated(Bundle savedInstanceState) {
125         Log.v(TAG, "Fragment1 onActivityCreated");
126         super.onActivityCreated(savedInstanceState);
127     }
128 
129 }
View Code

     

    1.创建回调接口;

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

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

 

    然后我给出Activity的代码:

  1 package com.example.fragmentdemo;
  2 
  3 import android.annotation.SuppressLint;
  4 import android.os.Bundle;
  5 import android.support.v4.app.Fragment;
  6 import android.support.v4.app.FragmentActivity;
  7 import android.support.v4.app.FragmentTransaction;
  8 import android.util.Log;
  9 import android.widget.TextView;
 10 
 11 import com.example.fragment.Fragment1;
 12 import com.example.fragment.Fragment1.OnButtonClickListener;
 13 import com.example.fragment.Fragment2;
 14 
 15 @SuppressLint("Recycle")
 16 public class MainActivity extends FragmentActivity implements
 17         OnButtonClickListener {
 18 
 19     private static final String TAG = "FragmentDemo";
 20     private Fragment1 fragment1;
 21     private Fragment2 fragment2;
 22 
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         Log.i(TAG, "onCreate");
 26         super.onCreate(savedInstanceState);
 27         setContentView(R.layout.activity_main);
 28         fragment1 = new Fragment1();
 29         fragment2 = new Fragment2();
 30         addFragment1();
 31         addFragment2();
 32     }
 33 
 34     private void addFragment1() {
 35         Bundle args = new Bundle();
 36         args.putString("hello", "Hello Fragment1");
 37         fragment1.setArguments(args);
 38         Log.i(TAG, "create Fragment1");
 39         FragmentTransaction transaction = getSupportFragmentManager()
 40                 .beginTransaction();
 41         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
 42         transaction.add(R.id.one, fragment1);
 43         transaction.addToBackStack(null);
 44         transaction.commit();
 45     }
 46 
 47     private void addFragment2() {
 48         Bundle args = new Bundle();
 49         args.putString("hello", "Hello Fragment2");
 50         fragment2.setArguments(args);
 51         Log.i(TAG, "create Fragment2");
 52         FragmentTransaction transaction = getSupportFragmentManager()
 53                 .beginTransaction();
 54         transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
 55         transaction.replace(R.id.two, fragment2);
 56         transaction.addToBackStack(null);
 57         transaction.commit();
 58     }
 59 
 60     @Override
 61     public void onAttachFragment(Fragment fragment) {
 62         Log.i(TAG, "onAttachFragment");
 63         super.onAttachFragment(fragment);
 64     }
 65 
 66     @Override
 67     protected void onDestroy() {
 68         Log.i(TAG, "onDestroy");
 69         super.onDestroy();
 70     }
 71 
 72     @Override
 73     protected void onPause() {
 74         Log.i(TAG, "onPause");
 75         super.onPause();
 76     }
 77 
 78     @Override
 79     protected void onResume() {
 80         Log.i(TAG, "onResume");
 81         super.onResume();
 82     }
 83 
 84     @Override
 85     protected void onStart() {
 86         Log.i(TAG, "onStart");
 87         super.onStart();
 88     }
 89 
 90     @Override
 91     protected void onStop() {
 92         Log.i(TAG, "onStop");
 93         super.onStop();
 94     }
 95 
 96     @Override
 97     protected void onRestart() {
 98         Log.i(TAG, "onRestart");
 99         super.onRestart();
100     }
101 
102     @Override
103     public void onButtonClicked() {
104         Log.i(TAG, "onButtonClicked");
105         TextView tv = (TextView) fragment1.getActivity().findViewById(
106                 R.id.fragment2_tv);
107         tv.setText(tv.getText() + "\n从Fragment1收到数据!");
108     }
109 }
View Code

 

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

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

 

  三、源码下载

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

 

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

 

转载于:https://www.cnblogs.com/getherBlog/p/3949171.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/546156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「递归」的正确打开方式,看不懂你打我~

这是磊哥的第 189 期分享作者 | 田小齐来源 | 码农田小齐(ID:NYCSDE) 分享 | Java中文社群(ID:javacn666)前言 递归,是一个非常重要的概念,也是面试中非常喜欢考的。因为它不但能考察…

Log4cpp 使用手册

参考资料: log4cpp 配置 与 使用http://www.cnblogs.com/welkinwalker/archive/2011/06/23/2088197.html 便利的开发工具-log4cpp快速使用指南 http://www.ibm.com/developerworks/cn/linux/l-log4cpp/ Log4cpp配置文件格式说明 http://sogo6.iteye.com/blog/115431…

switch 的性能提升了 3 倍,我只用了这一招!

这是我的第 190 期分享作者 | 王磊来源 | Java中文社群(ID:javacn666) 分享 | Java中文社群(ID:javacn666)上一篇《if快还是switch快?解密switch背后的秘密》我们测试了 if 和 switch 的性能&am…

HashMap get不出对象时出错 解决

为什么80%的码农都做不了架构师?>>> 如题: Map map new HashMap(); map.put("1", "A"); map.put("2", "A"); map.put("3", "A"); map.put("4", "A")…

高质量SQL的30条建议!(后端必备)

这是我的第 191 期分享作者 | 捡田螺的小男孩来源 | 捡田螺的小男孩(ID:gh_873ad5979a0b) 分享 | Java中文社群(ID:javacn666)本文将结合实例demo,阐述30条有关于优化SQL的建议,多数…

Redis的自白:我为什么在单线程的这条路上越走越远?

这是我的第 192 期分享作者 | 王磊来源 | Java中文社群(ID:javacn666)转载请联系授权(微信ID:GG_Stone)我是 Redis,今年 11 岁了~曾几何时我是辣么的单纯,辣么的可爱,而如…

关于引用

2019独角兽企业重金招聘Python工程师标准>>> 1、 <!-- lang: html --> <!DOCTYPE HTML> <!-- lang: html --> <html> <!-- lang: html --> <head> <!-- lang: html --> <meta charset"utf-8" /> <!--…

一口气说出 6 种延时队列的实现方法,面试官满意的笑了

这是我的第 193 期分享作者 | 程序员内点事来源 | 程序员内点事&#xff08;ID&#xff1a;chegnxy-nds&#xff09; 分享 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;五一期间原计划是写两篇文章&#xff0c;看一本技术类书籍&#xff0c;结果这五天由于自…

acl 服务器编程框架特点介绍

2019独角兽企业重金招聘Python工程师标准>>> acl 中服务器框架模块是一个非常重要的模块&#xff0c;使用该模块技术人员可以快速地写出稳定、安全、高效的网络服务应用&#xff0c;该模块主要来源于著名的邮件服务器程序 (Postfix) 中的 master 模块&#xff0c;为…

人人都能看懂的 6 种限流实现方案!(纯干货)

这是我的第 195 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;为了上班方便&#xff0c;去年我把自己在北郊的房子租出去了&#xff0c;搬到了南郊&#xff0c;这样…

測试新浪微博@小冰 为代码机器人的一些方法

微软的微信小冰被腾讯封杀之后,如今移民到了新浪微博; 小冰 这里贴一些眼下有效的用来识别是这是"机器"而不是有正常人类智商的代码的方法: 1. 在正常的文字中夹杂其他符号,确保不存在有意义的连续的词汇,人眼能够分辨,机器不知所云而会露馅: 比方: ^^^小v冰^^^-…

秒建一个后台管理系统?用这5个开源免费的Java项目就够了

这是我的第 196 期分享作者 | Guide来源 | JavaGuide&#xff08;ID&#xff1a;JavaGuide&#xff09; 分享 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;大家好&#xff0c;我是 Guide 哥&#xff0c;一个三观比主角还正的技术人。今天推荐几个 Java 项目…

读《白帽子讲Web安全》之客户端脚本安全(一)

2019独角兽企业重金招聘Python工程师标准>>> 【第2章 浏览器安全】 1、同源策略&#xff08;Same Origin Policy&#xff09;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能。 浏览器的同源策略&#xff0c;限制了来自不同源的“document”或脚本&…

RocketMQ一行代码造成消息发送失败

这是我的第 198 期分享作者 | 丁威来源 | 中间件兴趣圈&#xff08;ID&#xff1a;dingwpmz_zjj&#xff09;分享 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;1、问题现象首先接到项目反馈使用 RocketMQ 会出现如下错误&#xff1a;错误信息关键点&#xf…

Java 中的 String 有没有长度限制?

这是我的第 199 期分享作者 | Hollis来源 | Hollis&#xff08;ID&#xff1a;hollischuang&#xff09; 分享 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;关于String有没有长度限制的问题&#xff0c;我之前单独写过一篇文章分析过&#xff0c;最近我又抽…

开源 免费 java CMS - FreeCMS2.1 菜单管理

2019独角兽企业重金招聘Python工程师标准>>> 项目地址&#xff1a;http://www.freeteam.cn/ 菜单管理 FreeCMS在设计时定位于面向二次开发友好&#xff0c;所以FreeCMS提供了菜单管理功能&#xff0c;二次开发人员可以自由增加新的功能菜单到FreeCMS。 为了让后台…

本来想用“{{”秀一波,结果却导致了内存溢出!

这是我的第 200 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;生活中的尴尬无处不在&#xff0c;有时候你只是想简单的装一把&#xff0c;但某些“老同志”总是在不…

局部变量竟然比全局变量快 5 倍?

这是我的第 201 期分享作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;喽&#xff0c;大家好&#xff0c;磊哥的性能优化篇又来了&#xff01;其实写这个性能优化类的文章初…

FreeMarker笔记 前言第1章 入门

简介 简介 FreeMarker是一款模板引擎&#xff1a;一种基于模板的、用来生成输出文本&#xff08;任何来自于HTML格式的文本用来自动生成源代码&#xff09;的通用工具。它是为Java程序员提供的一个开发包或者说是类库。它不是面向最终用户&#xff0c;而是为程序员提供的可以嵌…

厉害了,3万字的MySQL精华总结 + 面试100问!

这是我的第 202 期分享作者 | 派大新来源 | JavaKeeper&#xff08;ID&#xff1a;JavaKeeper&#xff09;分享 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;❝写在之前&#xff1a;不建议那种上来就是各种面试题罗列&#xff0c;然后背书式的去记忆&#x…