当前位置: 首页 > news >正文

Android——Activity和Fragment的通信方式

文章目录

  • Activity之间的通信
  • Activity与Fragment之间的通信
  • Fragment之间的通信

Activity之间的通信

  1. 使用startActivityForResult启动Activity
//在mainActivity中封装Bundle数据到Intent中再启动AACtivity
Intent intent = new Intent(MainActivity.this,AActivity.class);
Bundle bundle = new Bundle();
bundle.putString("name","zhangsan");
bundle.putInt("age",18);
intent.putExtra("user",bundle);
startActivityForResult(intent,0);
//在AACtivity中获取数据并显示
ntent intent = getIntent();
Bundle bundle = intent.getBundleExtra("user");
String str = "name:";
str += bundle.getString("name");
str += ",age:" + bundle.getInt("age");
mTvAShow.setText(str);
//关闭AActivity并且回传数据到MainACtivity显示
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("user");
bundle.putString("name","lisi");
bundle.putInt("age",20);
setResult(200,intent);
finish();
//重写AActivity中的关于回退的处理
@Override
public void onBackPressed() {
    Intent intent = getIntent();
    Bundle bundle = intent.getBundleExtra("user");
    bundle.putString("name","lisi");
    bundle.putInt("age",20);
    setResult(200,intent);
    super.onBackPressed();
}

  1. 使用类的静态变量
    在MainActivity中设置静态变量,在其他Activity中可以直接使用类名.静态变量名来访问,在其他Activity中可以定义监听器接口,并在MainActivity中注册,当其他类中对MainActivity中的静态变量进行更改时可以通知到MainActivity进行操作。
//MainActivity中
static User user = new User();
//MainActivity中的监听器注册
AActivity.aActivityListener = new AActivity.AActivityListener(){
    @Override
    public void getMessage() {
        String str = "name:";
        str += user.name;
        str += ",age:" + user.age;
        mTvShow.setText(str);
    }
};
//AActivity中的静态监听器变量
public static AActivityListener aActivityListener;
//AActivity中的监听器接口定义
public interface AActivityListener{
	public void getMessage();
}
//改变数据并且回调MainACtivity中的方法
MainActivity.user.name = "lisi";
MainActivity.user.age = 20;
aActivityListener.getMessage();
finish();


  1. 使用Application实现
//继承Application并在自己的app类中携带数据
public class MyApplication  extends Application { {
    //此处声明一个public static 成员来实现数据通信
    private static String name = "Son of the sea"; 
    public void setName(String name){
          this.name = name;
    }
   public String getName() {
        return this.name ;
    }
}
//其它Activity中获取或者改变数据的方式
MyApplication  app = (MyApplication) getApplicationContext();
app.setName("Son of the king"); 
//必须在清单文件中加以说明
<application
   android:name=".MyApplication " 
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name" >
   <activity
       android:label="@string/app_name"
       android:name=".MainActivity" >
       <intent-filter >
           <action android:name="android.intent.action.MAIN" />
           <category android:name="android.intent.category.LAUNCHER" />
       </intent-filter>
   </activity>
</application>

  1. 借助外部存储完成通讯
    借助SharedPerference、File和SQLite都可以完成,这里不再赘述。

  1. 借助广播和Service实现
    由于Activity中的通信使用第一种方式已经足够使用,这两种方式虽然都可以实现,但是如没有必要,建议不要使用。

Activity与Fragment之间的通信

  1. Activity向Fragment传递数据
//在Fragment中提供newInstance的方法:用于Activity向Fragment中传入数据
public static ContentFragment newInstance(String argument){          
	Bundle bundle = new Bundle();          
	bundle.putString("msg", argument);          
	ContentFragment contentFragment = new ContentFragment();          
	contentFragment.setArguments(bundle);         
	return contentFragment;      
}
// 在Fragment的onCreate方法中获取Activity中传入的参数
@Override      
public void onCreate(Bundle savedInstanceState){          
	super.onCreate(savedInstanceState);                 
	Bundle bundle = getArguments();          
	if (bundle != null)              
	mArgument = bundle.getString("tag");        
}

  1. Fragment向Activity传递数据
//Fragment中添加监听器成员并定义接口
private onTestListener listener;
public interface onTestListener{  
	public void onTest(String str);  
}
//Fragment中提供注册监听的方式
public setTestListener(onTestListener callback){
	listener = callback;
}
//Fragment在需要向Activity中发送数据时,调用监听器方法
listener.onTest(string);
//Activity中设置注册监听器并提供实现
Fragment fragment = new ContentFragment();
fragment.setTestListener(new ContentFragment.onTestListener(){
	@Override
    public void onTest(String str) {
    	Log.d(TAG,str);
        //执行更新UI操作或其他操作
    }
})

Fragment之间的通信

//FragmentA发消息给FragmentB
//在FragmentA中通过以下调用获得FragmentB的引用并设置参数
//在FragmentB中可以获得此参数
Fragment fragment = activity.getFragmentManager().findFragmentByTag(R.id.fragmentb);
Bundle bundle = new Bundle();
bundle.putString("msg",string);
fragment.setArguments(bundle);
//FragmentB主动向FragmentA发送数据:FragmentB中定义接口
//FragmentA调用设置监听的方法提供监听器实现
//FragmentB在需要传送数据时调用监听器方法即可
  • 获取Fragment引用的几种方式

适合在layout中定义的单个fragment
getSupportFragmentManager().findFragmentById();
适合定义的多个fragment,可在xml文件和代码中添加tag
getSupportFragmentManager().findFragmentByTag();

相关文章:

  • 【校招VIP】前端项目开发之正则表达
  • Vite创建Vue2项目中,封装svg-icon组件并使用——插件之vite-plugin-svg-icons和fast-glob
  • 洛谷题单 Part2.1 模拟
  • Selenium 中的 JUnit 注解
  • ES6中的set、map
  • 基python的毕业设计题目超市进存销系统
  • 云计算基础
  • C语言文件基本操作
  • 2022年全球及中国疏水阀行业头部企业市场占有率及排名调研报告
  • java6.2 springCloud
  • 第6章Linux实操篇-开机、重启和用户登录注销
  • 大学网课答案微信公众号接口使用方法
  • 第5章Linux实操篇-Vi和Vim编辑器
  • java6.1 springboot
  • Linux高性能服务器之I/O复用之实例 ET AND LT(图像理解)(14)
  • Angular 4.x 动态创建组件
  • AWS实战 - 利用IAM对S3做访问控制
  • JAVA SE 6 GC调优笔记
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js如何打印object对象
  • NSTimer学习笔记
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Tornado学习笔记(1)
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • MyCAT水平分库
  • Nginx惊现漏洞 百万网站面临“拖库”风险
  • !!java web学习笔记(一到五)
  • #pragma预处理命令
  • #图像处理
  • $.ajax()方法详解
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net MVC + EF搭建学生管理系统
  • .Net Redis的秒杀Dome和异步执行
  • .Net 垃圾回收机制原理(二)
  • .NetCore项目nginx发布
  • .sh
  • :中兴通讯为何成功
  • @RestControllerAdvice异常统一处理类失效原因
  • [ 数据结构 - C++]红黑树RBTree
  • [20171101]rman to destination.txt
  • [android学习笔记]学习jni编程
  • [C#基础知识]专题十三:全面解析对象集合初始化器、匿名类型和隐式类型
  • [C++]运行时,如何确保一个对象是只读的
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [DevEpxress]GridControl 显示Gif动画
  • [Django 0-1] Core.Handlers 模块
  • [HJ73 计算日期到天数转换]
  • [iOS]-UIKit