Android -- 四大组件Fragment 与 Activity 之间通信
Posted Kevin-Dev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android -- 四大组件Fragment 与 Activity 之间通信相关的知识,希望对你有一定的参考价值。
不断学习,做更好的自己!💪
视频号 | CSDN | 简书 |
---|---|---|
欢迎打开微信,关注我的视频号:KevinDev | 点我 | 点我 |
一、Activity 之间数据通信
1. Bundle
此方法可以传递基本数据类型和 String 类型的数据,如果传递的是对象就需要进行序列化(Parcelable)。
Bundle bundle = new Bundle();
bundle.putString("name", "chenjy");
bundle.putInt("age", 18);
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtras(bundle);
startActivity(intent);
2. 静态变量/全局变量及Application/android 系统剪切板
这三种方式其实非常相似,静态变量和全局变量都可以采用 static 的方式来定义,如果采用这种方式还是推荐用一个专门的类结合单体模式进行管理,尽量减少对内存的消耗。
3. EventBus
EventBus 是一款针对 Android 的发布以及订阅事件总线,使用它可以很方便的进行信息传递,而且使用起来很方便。
首先是定义一个消息:
public class Event
private String message;
public Event()
message = "EventBus message";
public void setMessage(String message)
this.message = message;
public String getMessage()
return message;
发送消息:
这里使用了postSticky,这是发送的粘性广播,使用这个发送就可以先发送信息再进行注册,后注册的也能接收到前面发送的广播。当然还有其他的使用方式,可以查查api文档。
EventBus.getDefault().postSticky(new Event());
startActivity(new Intent(MainActivity.this,ReceiveActivity.class));
注册事件的订阅者:
EventBus.getDefault().register(this);
接受粘性广播:
@Subscribe(sticky = true, threadMode = ThreadMode.MAIN)
public void onEventThread(Event event)
textView.setText(event.getMessage());
二、Fragment 之间数据通信
1. 接口回调
step1. 在Menuragment中创建一个接口以及接口对应的set方法:
//MenuFragment.java文件中
public interface OnDataTransmissionListener
public void dataTransmission(String data);
public void setOnDataTransmissionListener(OnDataTransmissionListener mListener)
this.mListener = mListener;
step2: 在MenuFragment中的ListView条目点击事件中进行接口进行接口回调
//MenuFragment.java文件中
lv.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
/**
* 方法二:采取接口回调的方式进行数据传递
*/
if (mListener != null)
mListener.dataTransmission(mDatas.get(position));
);
step3: 在MainActivity中根据menuFragment获取到接口的set方法,在这个方法中进行进行数据传递,具体如下:
//在MainActivity.java中
menuFragment.setOnDataTransmissionListener(new MenuFragment.OnDataTransmissionListener()
@Override
public void dataTransmission(String data)
mainFragment.setData(data); //注:对应的mainFragment此时应该要用final进行修饰
);
2. EventBus
三、Fragment 与 Activity 之间数据通信
1. handler方案
public class MainActivity extends FragmentActivity
//声明一个Handler
public Handler mHandler = new Handler()
@Override
public void handleMessage(Message msg)
super.handleMessage(msg);
...相应的处理代码
...相应的处理代码
public class MainFragment extends Fragment
//保存Activity传递的handler
private Handler mHandler;
@Override
public void onAttach(Activity activity)
super.onAttach(activity);
//这个地方已经产生了耦合,若还有其他的activity,这个地方就得修改
if(activity instance MainActivity)
mHandler = ((MainActivity)activity).mHandler;
...相应的处理代码
2. 广播方案
3. EventBus方案
4. 接口方案
//MainActivity实现MainFragment开放的接口
public class MainActivity extends FragmentActivity implements FragmentListener
@override
public void toH5Page()
...其他处理代码省略
public class MainFragment extends Fragment
public FragmentListener mListener;
//MainFragment开放的接口
public static interface FragmentListener
//跳到h5页面
void toH5Page();
@Override
public void onAttach(Activity activity)
super.onAttach(activity);
//对传递进来的Activity进行接口转换
if(activity instance FragmentListener)
mListener = ((FragmentListener)activity);
...其他处理代码省略
5. 封装Functions
FunctionException.java
public class FunctionException extends Exception
public FunctionException(String msg)
super();
Functions.java
public class Functions
/**
* 带有参数和返回值的 方法
* @param <Result>
* @param <Param>
*/
public static abstract class FunctionWithParamAndResult<Result,Param> extends Function
public FunctionWithParamAndResult(String functionName)
super(functionName);
public abstract Result function(Param data);
/**
* 没有参数和返回值的方法
*/
public static abstract class Function
public String mFunctionName;
public Function(String functionName)
this.mFunctionName = functionName;
/**
* 有返回值,没有参数的方法
* @param <Result>
*/
public static abstract class FunctionWithResult<Result> extends Function
public FunctionWithResult(String functionName)
super(functionName);
public abstract Result function();
/**
* 带有参数没有返回值的方法
* @param <Param>
*/
public static abstract class FunctionWithParam<Param> extends Function
public FunctionWithParam(String functionName)
super(functionName);
public abstract void function(Param param);
/**
* 没有参数和返回值的方法
*/
public static abstract class FunctionNoParamAndResult extends Function
public FunctionNoParamAndResult(String functionName)
super(functionName);
public abstract void function();
private HashMap<String,FunctionWithParam> mFunctionWithParam ;
private HashMap<String,FunctionWithResult> mFunctionWithResult ;
private HashMap<String,FunctionNoParamAndResult> mFunctionNoParamAndResult ;
private HashMap<String,FunctionWithParamAndResult> mFunctionWithParamAndResult ;
/**
* 添加带参数的函数
* @param function
* @return
*/
public Functions addFunction(FunctionWithParam function)
if(function == null)
return this;
if(mFunctionWithParam == null)
mFunctionWithParam = new HashMap<>(1);
mFunctionWithParam.put(function.mFunctionName,function);
return this;
/**
* 添加带返回值的函数
* @param function
* @return
*/
public Functions addFunction(FunctionNoParamAndResult function)
if(function == null)
return this;
if(mFunctionNoParamAndResult == null)
mFunctionNoParamAndResult = new HashMap<>(1);
mFunctionNoParamAndResult.put(function.mFunctionName,function);
return this;
/**
* 添加既有参数又有返回值的函数
* @param function
* @return
*/
public Functions addFunction(FunctionWithParamAndResult function)
if(function == null)
return this;
if(mFunctionWithParamAndResult == null)
mFunctionWithParamAndResult = new HashMap<>(1);
mFunctionWithParamAndResult.put(function.mFunctionName,function);
return this;
/**
* 添加带有返回值的函数
* @param function
* @return
*/
public Functions addFunction(FunctionWithResult function)
if(function == null)
return this;
if(mFunctionWithResult == null)
mFunctionWithResult = new HashMap<>(1);
mFunctionWithResult.put(function.mFunctionName,function);
return this;
/**
* 根据函数名,回调无参无返回值的函数
* @param funcName
*/
public void invokeFunc(String funcName) throws FunctionException
FunctionNoParamAndResult f = null;
if(mFunctionNoParamAndResult != null)
f = mFunctionNoParamAndResult.get(funcName);
if(f != null)
f.function();
if(f == null)
throw new FunctionException("没有此函数");
/**
* 根据函数名,回调无参有返回值的函数
* @param funcName
*/
public <Result> Result invokeFuncWithResult(String funcName, Class<Result> c) throws FunctionException
FunctionWithResult f = null;
if(mFunctionWithResult != null)
f = mFunctionWithResult.get(funcName);
if(f != null)
if(c != null)
return c.cast(f.function());
else
return (Result)f.function();
if(f == null)
throw new FunctionException("没有此函数");
return null;
/**
* 调用具有参数的函数
* @param funcName
* @param param
* @param <Param>
*/
public <Param> void invokeFunc(String funcName,Param param)throws FunctionException
FunctionWithParam f = null;
if(mFunctionWithParam != null)
f = mFunctionWithParam.get(funcName);
if(f != null)
f.function(param);
/**
* 调用具有参数,同时具有返回值的函数
* @param funcName
* @param param
* @param <Result>
* @param <Param>
* @return
*/
public <Result,Param> Result invokeFuncWithResult(String funcName,Param param,Class<Result> c) throws FunctionException
FunctionWithParamAndResult f = null;
if(mFunctionWithParamAndResult != null)
f = mFunctionWithParamAndResult.get(funcName);
if(f != null)
if(c != null)
return c.cast(f.function(param));
else
return (Result)f.function(param);
if( f == null)
throw new FunctionException("没有此函数");
return null;
/**
* 函数的参数,当函数的参数涉及到多个值时,可以用此类,
* 此类使用规则:存参数与取参数的顺序必须一致,否则报错
*/
public static class FunctionParams
private Bundle mParams = new Bundle(1);
private int mIndex = -1;
private Map mObjectParams = new HashMap(1);
FunctionParams(Bundle mParams,Map mObjectParams)
this.mParams = mParams;
this.mObjectParams = mObjectParams;
public <Param> Param getObject(Class<Param> p)
if(mObjectParams == null)
return null;
return p.cast(mObjectParams.get((mIndex++) + ""));
/**
* 获取int值
* @return
*/
public int getInt()
if(mParams != null)
return mParams.getInt((mIndex++) + "");
return 0;
/**
* 获取int值
* @param defalut
* @return
*/
public int getInt(int defalut)
if(mParams != null)
return mParams.getInt((mIndex++) + "");
return defalut;
/**
* 获取字符串
* @param defalut
* @return
*/
public String getString(String defalut)
if(mParams != null)
return mParams.getString((mIndex++) + "");
return defalut;
/**
* 获取字符串
* @return
*/
public String getString()
if(mParams != null)
return mParams.getString((mIndex++) + "");
return null;
/**
* 获取Boolean值
* @return 默认返回false
*/
public boolean getBoolean()
if(mParams != null)
return mParams.getBoolean((mIndex++) + 以上是关于Android -- 四大组件Fragment 与 Activity 之间通信的主要内容,如果未能解决你的问题,请参考以下文章
Android 四大组件 ContentProvider介绍
Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)
Android学习之Fragment的各种实现功能(头部折叠,循环列表RecyclerView,左右滑动ViewPager)