【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,一经查实,立即删除!

相关文章

next和hasnext_使用Java中的next()和hasNext()方法遍历List元素

next和hasnextGiven a List of integers and we have to traverse, print all its element using next() and hasNext() methods. 给定一个整数列表,我们必须遍历,使用next()和hasNext()方法打印其所有元素。 什么是hasNex()和next()方法? (…

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

这是磊哥的第 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…

适合初学编程的一些项目

学习了一门语言以及数据结构之后,通常需要做一些项目来巩固所学的知识,我感觉最好是用写一些简单的小工具或者小游戏,能够提高自己的编程能力,也能进一步提高自己学习的兴趣。最好的是将自己想做的事情用程序的实现,比…

python 5的倍数_查找所有低于1000的数字的和,这是Python中3或5的倍数

python 5的倍数Sometimes, we need to find the sum of all integers or numbers that are completely divisible by 3 and 5 up to thousands, since thousands are a too large number that’s why it becomes difficult for us. So, here we will do it in Python programmi…

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")…

安装codeblocks和wxwidgets及opencv

codeblocks 是一款开放源代码的跨平台的c/c++集成开发环境,它是用wxwidgets 开发的,并且支持插件,功能很强大。可以用来在windows开发各种程序。下面记录一下我安装该软件的过程: 首先到http://www.codeblocks.org/downloads 下载该软件,选择含mingw的文件(codeblocks-10…

Java LinkedList boolean addAll(int index,Collection c)方法,带有示例

LinkedList boolean addAll(int index,Collection c)方法 (LinkedList boolean addAll(int index, Collection c) method) This method is available in package java.util.Collection and here, Collection is an interface. 该方法在java.util.Collection包中可用…

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

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

滤波电容的选择(调试中)

整个系统高电平时12V,信号是ms级的负脉冲,脉冲的下降沿很陡,当用示波器展开看的时候,发现了低于0V的过冲,能低到-6V(相当严重),这是在整个箱子的出口处测量到的。在主控板&#xff0…

sicp

sicp (structure and interpretion of computer programs ,编号为6.001 )是麻省理工学院的一门经典计算机入门课程,虽然近年被另外一门课程所取代(6.00 或6.01 ),但最近好像有复活 的迹象。Perter Norvig 写了关于sicp…

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

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

两个矩阵相乘的乘法次数_C ++程序将两个数字相乘而不使用乘法运算符

两个矩阵相乘的乘法次数The problem is we have two integer numbers and find the multiplication of them without using the multiplication operator. This problem can be solved using the Russian peasant algorithm. Assume the two given numbers are m and n. Initia…

关于引用

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

ruby array_在Ruby中使用Array.delete()和Array.delete_at()从Array中移除元素

ruby arrayRuby Array.delete()和Array.delete_at()方法 (Ruby Array.delete() and Array.delete_at() methods) In the last article, we have seen how we can remove the elements from an instance of Array class with the help of Array.pop() and Array.shift()? 在上一…

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

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

一些c语言图形库

想编程绘制一些简单的图形&#xff0c;有不少的图形库可以选择&#xff1a; &#xff08;1&#xff09;BGI图形库&#xff1a;即turbo c所带的图形库。misaki 在vc&#xff08;vc6,vc2008,vc2010等)下重写了该库&#xff0c;名为EGE 。另一个类似的vc(vc6,vc2008,vc2010)下的库…

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

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

turbo c相关文档

无意中在网上找到的turbo c 2.0相关文档&#xff0c;有reference guide 和user guide.下载地址见&#xff08;镜像一 &#xff0c;镜像二 &#xff0c;镜像三 &#xff0c;镜像四 &#xff09;。这些网站还有很多其他各类软件相关文档&#xff0c;感兴趣的可以自己看看。另外&a…