摘自:安卓APP_ Fragment(2)—— Activity与Fragment的通信
作者:丶PURSUING
发布时间: 2021-04-16 17:23:44
网址:https://blog.csdn.net/weixin_44742824/article/details/115743009

目录

  • Activity与Fragment的通信
    • (1)原生方案1:Bundle。
      • 具体细节在代码中呈现
    • (2)方案2:Java语言中类与类自己通信常用方案:接口
    • (3)方案3:第三方架构

Activity与Fragment是两个独立类,负责UI的展示,那他们如何进行通信呢?

Activity与Fragment的通信

(1)原生方案1:Bundle。

可以理解为通信时使用的通用工具,可以保存数据的独立的类。

安卓APP_ Fragment(1) 篇章的基础上,沿用原来的例子,演示在动态添加fragment下,Activity如何向Fragment发送信息。下图的my name is zhua字符串是从Activity中向fragment传递的信息,fragment收到后并打印出来。


具体实现:

(1)在MainActivity中bundle对象的创建并且与fragment绑定
在对应的fragment.java中使用并打印

进阶题外话:如何传输javaBean?不能直接传,但是可以把Bean变成某一个key,
这个key对应的是parcelable,parcelable就可以携带javaBean

具体细节在代码中呈现

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_1"android:text="@string/change"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/btn_2"android:text="@string/replace"/><!--    除去按钮,剩余的空间都是FrameLayout--><FrameLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:id="@+id/fm"android:background="@color/teal_200"/></LinearLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button button1 = findViewById(R.id.btn_1);button1.setOnClickListener(this);Button button2 = findViewById(R.id.btn_2);button2.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn_1:Bundle bundle = new Bundle();//将Activity中的信息放进bundlebundle.putString("message", "my name is zhua");//需要实例化一个BlankFragment1对象bfBlankFragment1 bf = new BlankFragment1();//数据传入bf中bf.setArguments(bundle);//动态切换fragmentreplaceFragment(bf);break;case R.id.btn_2:replaceFragment(new ItemFragment());}}//完成动态切换fragmentprivate void replaceFragment(Fragment fragment) {FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction transaction = fragmentManager.beginTransaction();transaction.replace(R.id.fm, fragment);transaction.commit();}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

BlankFragment.java

public class BlankFragment1 extends Fragment {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//这个getArguments返回的是在MainActivity中传入的bundleBundle bundle = this.getArguments();//获取bundle里面保存的内容String string = bundle.getString("message");//在fragment中打印从Activity中传递来的信息Log.e("zhua", "onCreate: "+string);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentreturn inflater.inflate(R.layout.fragment_blank1, container, false);}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

flagment_blank1.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".BlankFragment1"><!-- TODO: Update blank fragment layout --><TextViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffff00"android:textSize="40dp"android:text="@string/hello_blank_fragment" /></FrameLayout>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

(2)方案2:Java语言中类与类自己通信常用方案:接口

面向接口编程:用接口实现两者的通信,消息互传。(从老师的描述中可以发现不好用,先不学,不学了。)

(3)方案3:第三方架构

当Activity发送消息的时候,Fragment根据需要(对Activity这个消息“感不感兴趣”),选择接收还是不接受。

要用到其他的通信方案,即编译器已经封装好的接口,如eventBus,LiveData…

在这样的方案里面包含了一个设计模式,叫观察者模式(或者叫发布订阅模式)。比如我Fragment作为信息的接收方,当Activity信息发生变化的且是我需要的时候,我就会收录这个信息。

进阶内容,后续再做补充。

安卓APP_ Fragment(2)—— Activity与Fragment的通信相关推荐

  1. Fragment与Activity之间的相互通信

    https://blog.csdn.net/u012702547/article/details/49786417 https://blog.csdn.net/carson_ho/article/de ...

  2. android 状态栏一体化 fragment,单Activity多Fragment动态修改状态栏颜色功能

    目录介绍 1.关于如何集成 2.关于如何使用 3.关于鸣谢 4.关于版本更新说明 5.关于其他介绍 0.说明 状态栏工具类,应该可以满足绝大多数的使用场景.具体可以参考代码案例,欢迎star!! 1. ...

  3. activity改成fragment android,Activity转换为Fragment

    Activity中加载不同的fragment  / Fragment中加载不同的fragment 主Activity中加载(切换)多个fragment(也可以理解为activity 尽管Fragmen ...

  4. Activity和Fragment生命周期变化

    情形一:启动应用加载Activity和Fragment Activity::onCreate Fragment::onAttach Fragment::onCreate Fragment::onCre ...

  5. 安卓APP_ Fragment(4)—— Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页

    摘自:安卓APP_ Fragment(4)-- Fragment + ViewPager2 模拟微信首页 (1)两者联动实现翻页 作者:丶PURSUING 发布时间: 2021-04-20 17:46 ...

  6. 安卓APP_ Fragment(3)—— Fragment的生命周期

    摘自:安卓APP_ Fragment(3)-- Fragment的生命周期 作者:丶PURSUING 发布时间: 2021-04-16 22:32:12 网址:https://blog.csdn.ne ...

  7. 安卓APP_ Fragment(1)—— Fragment概念、基础用法、动态变换、管理栈

    摘自:安卓APP_ Fragment(1)-- Fragment概念.基础用法.动态变换.管理栈 作者:丶PURSUING 发布时间: 2021-04-15 23:32:31 网址:https://b ...

  8. 安卓APP_ Fragment(5)—— Fragment + ViewPager2 模拟微信首页 (2)两者联动翻页

    摘自:安卓APP_ Fragment(5)-- Fragment + ViewPager2 模拟微信首页 (2)两者联动实现翻页 作者:丶PURSUING 发布时间: 2021-04-22 00:11 ...

  9. WaveSwipeRefreshLayout实现微信热文精选,微信热文安卓app版,activity中viewpager套fragment

    微信热文安卓app版,微信热文精选. 安卓结合HTML5快速开发app应用,比原生写出来的效果还要好.极大的减小安卓app应用大小. 代码示例(演示apk):http://download.csdn. ...

最新文章

  1. 【深入浅出Node.js系列十一】Node.js开发框架Express4.x
  2. 学习Kotlin(三)类和接口
  3. HTML5 required是必填
  4. java中使用es的dsl_基于DSL的基于图论的Java程序中输入图数据的方法
  5. Java终于可以加入字符串
  6. python from numpy import,python zeros()使用(from numpy import *)-Go语言中文社区
  7. C++一天一个程序(五)
  8. Linux下nm和ldd 命令
  9. [vue] vue使用v-for遍历对象时,是按什么顺序遍历的?如何保证顺序?
  10. mysql 无法处理非法数据_MySQL 处理非法数据
  11. apache php 重写url无效,apache用rewrite重写url时出现问题
  12. Qt程序缺少dll解决方案
  13. Telnet配合netty打印数据(springboot+netty)
  14. 让华泰浮盈10亿美金的AssetMark-统包资产管理平台价值几何?
  15. Linux的操作系统下载及安装
  16. 02-最基本的SELECT语句
  17. 大班音乐机器人反思_大班音乐活动机器人
  18. linux中u盘驱动程序编写,Linux下的硬件驱动——USB设备(下)(驱动开发部分)...
  19. [附源码]Java计算机毕业设计SSM房屋租赁管理系统设计
  20. 融云助力中国企业打造海外云平台

热门文章

  1. OC Swift混编-Swift.h File not found
  2. 企业级 Spring Boot 教程 (十四)用restTemplate消费服务
  3. C++编程经验总结1
  4. wdk1703+vs2015编译的诡异问题
  5. 分页探究--Filter+JSTL
  6. 细说JavaScript对象(1):对象的使用和属性
  7. 无用的设计模式之装饰者模式
  8. PHP ThinkPHP学习第一步(搭建及认识ThinkPHP入口文件)
  9. mysql升级5.5
  10. 先弄个XML解析器代码抄一抄 慢慢研究 O(∩_∩)O哈哈~