架构师成长之路-基于android fragment通信的面向对象的万能接口
前言
一 常用的Activity和Fragment几种通信方式
二 万能接口
public abstract class Function {
/** 方法名 */
public String mFunctionName ;
public Function (String funName){
this.mFunctionName = funName;
}
}
2 建立无(有)参数无(有)四类
/**
* 无参无返回值
* <h3>Description</h3>
* TODO
* <h3>Author</h3> luzhenbang
* <h3>Date</h3> 2018/1/4 16:13
* <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
*/
public abstract class FunctionNoParamNoResult extends Function { public FunctionNoParamNoResult(String funName) {
super(funName);
} public abstract void function(); }
/**
* 有参无返回值
* <h3>Description</h3>
* TODO
* <h3>Author</h3> luzhenbang
* <h3>Date</h3> 2018/1/4 16:13
* <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
*/ public abstract class FunctionWithParamOnly<Param> extends Function {
public FunctionWithParamOnly(String funName) {
super(funName);
}
public abstract void function(Param param);
}
/**
* 有参有返回值
* <h3>Description</h3>
* TODO
* <h3>Author</h3> luzhenbang
* <h3>Date</h3> 2018/1/4 16:13
* <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
*/ public abstract class FunctionWithParamWithResult<Result,Param> extends Function {
public FunctionWithParamWithResult(String funName) {
super(funName);
}
public abstract Result function(Param param);
}
/**
* 无参有返回值
* <h3>Description</h3>
* TODO
* <h3>Author</h3> luzhenbang
* <h3>Date</h3> 2018/1/4 16:13
* <h3>Copyright</h3> Copyright (c)2018 Shenzhen TL Co., Ltd. Inc. All rights reserved.
*/ public abstract class FunctionWithResultOnly<Result> extends Function {
public FunctionWithResultOnly(String funName) {
super(funName);
}
public abstract Result function();
}
3 建立管理器类
public class FunctionManager {
private static FunctionManager instance = null;
public static final String TAG = FunctionManager.class.getSimpleName() + "-------->";
/**容器,用来存储方法名字 key 对应的方法名 value 对应的是 参数返回对象*/
private HashMap<String,FunctionWithParamWithResult> mFunctionWithParamWithResultHashMap = null;
private HashMap<String,FunctionWithParamOnly> mFunctionWithParamsOnlyHashMap = null;
private HashMap<String,FunctionWithResultOnly> mFunctionWithResultOnlyHashMap = null;
private HashMap<String,FunctionNoParamNoResult> mFunctionNoParamNoResultHashMap = null;
private FunctionManager() {
mFunctionNoParamNoResultHashMap = new HashMap<>();
mFunctionWithParamWithResultHashMap = new HashMap<>();
mFunctionWithParamsOnlyHashMap = new HashMap<>();
mFunctionWithResultOnlyHashMap = new HashMap<>();
}
public static FunctionManager getInstance() {
if (null == instance){
instance = new FunctionManager();
}
return instance;
}
/**
* 添加无参无返回值的方法
* @return
*/
public FunctionManager addFunction(FunctionNoParamNoResult function){
mFunctionNoParamNoResultHashMap.put(function.mFunctionName,function);
return this;
}
/**
* 添加有返回值的方法
* @return
*/
public FunctionManager addFunction(FunctionWithResultOnly function){
mFunctionWithResultOnlyHashMap.put(function.mFunctionName,function);
return this;
}
/**
* 添加有参数的方法
* @return
*/
public FunctionManager addFunction(FunctionWithParamOnly function){
mFunctionWithParamsOnlyHashMap.put(function.mFunctionName,function);
return this;
}
/**
* 添加有参有返回值的方法
* @return
*/
public FunctionManager addFunction(FunctionWithParamWithResult function){
mFunctionWithParamWithResultHashMap.put(function.mFunctionName,function);
return this;
}
/**
* 调用无返回值无参数的方法
* @param funName
*/
public void invokeNoAll (String funName) throws NullPointerException {
if (TextUtils.isEmpty(funName)){
Log.e(TAG,"funName is null !");
}else {
if ( null != mFunctionNoParamNoResultHashMap){
FunctionNoParamNoResult function = mFunctionNoParamNoResultHashMap.get(funName);
if (null != function){
function.function();
}else {
Log.e(TAG,"function is null !");
}
}else {
throw new NullPointerException("mFunctionNoParamNoResultHashMap can not be null ,please first init FunctionManager !");
}
}
}
/**
* 调用有参数的方法
* @param funName
*/
public <Param> void invokeWithParamOnly (String funName,Param param) throws NullPointerException {
if (TextUtils.isEmpty(funName)){
Log.e(TAG,"funName is null !");
}else {
if ( null != mFunctionWithParamsOnlyHashMap){
FunctionWithParamOnly<Param> function = mFunctionWithParamsOnlyHashMap.get(funName);
if (null != function){
function.function(param);
}else {
Log.e(TAG,"function is null !");
}
}else {
throw new NullPointerException("mFunctionWithParamsOnlyHashMap can not be null ,please first init FunctionManager !");
}
}
}
/**
* 调用有返回值的方法
* @param funName
*/
public <Result> Result invokeWithResultOnly (String funName, Class<Result> c) throws NullPointerException {
if (TextUtils.isEmpty(funName)){
Log.e(TAG,"funName is null !");
}else {
if ( null != mFunctionWithResultOnlyHashMap){
FunctionWithResultOnly function = mFunctionWithResultOnlyHashMap.get(funName);
if (null != function){
if ( null != c){
return c.cast(function.function());
}else {
return (Result) function.function();
}
}else {
Log.e(TAG,"function is null !");
}
}else {
throw new NullPointerException("mFunctionWithParamsOnlyHashMap can not be null ,please first init FunctionManager !");
}
}
return null;
}
/**
* 调用有参数有返回值的方法
* @param funName
*/
public <Result,Param> Result invokeWithAll (String funName, Class<Result> c,Param param) throws NullPointerException {
if (TextUtils.isEmpty(funName)){
Log.e(TAG,"funName is null !");
}else {
if ( null != mFunctionWithParamWithResultHashMap){
FunctionWithParamWithResult<Result,Param> function = mFunctionWithParamWithResultHashMap.get(funName);
if (null != function){
if ( null != c){
return c.cast(function.function(param));
}else {
return function.function(param);
}
}else {
Log.e(TAG,"function is null !");
}
}else {
throw new NullPointerException("mFunctionWithParamsOnlyHashMap can not be null ,please first init FunctionManager !");
}
}
return null;
}
}
4 在Activity写一个方法
public void setFunctionForFragment(String tag){
if (TextUtils.isEmpty(tag)){
Log.e(MainActivity.class.getSimpleName(),"tag is null !");
return;
}
BaseFragment fragment = (BaseFragment) fm.findFragmentByTag(tag);
FunctionManager functionManager = FunctionManager.getInstance();
functionManager.addFunction(new FunctionNoParamNoResult(FunctionNoParamNoResult) {
@Override
public void function() {
Toast.makeText(MainActivity.this, "无参无返回值", Toast.LENGTH_SHORT).show();
}
});
functionManager.addFunction(new FunctionWithResultOnly<String>(FunctionWithResultOnly) {
@Override
public String function() {
return "无参有返回值";
}
});
functionManager.addFunction(new FunctionWithParamOnly<String>(FunctionWithParamOnly) {
@Override
public void function(String o) {
Toast.makeText(MainActivity.this, o, Toast.LENGTH_SHORT).show();
}
});
functionManager.addFunction(new FunctionWithParamWithResult<String,String>(FunctionWithParamWithResult) {
@Override
public String function(String o) {
return o;
}
});
fragment.setFunctionManager(functionManager);
}
5 编辑一个Fragment基类(实用Fragment的时候直接集成该类就可以了),并绑定上面建立的接口
public class BaseFragment extends Fragment{
public FunctionManager mFunctionManager;
private MainActivity mainActivity;
public void setFunctionManager(FunctionManager mFunctionManager) {
this.mFunctionManager = mFunctionManager;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof MainActivity) {
mainActivity = (MainActivity) context;
mainActivity.setFunctionForFragment(getTag());
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mainActivity = null;
}
}
6 继承BaseFragment
public class NoParamNoResultFragment extends BaseFragment {
private Handler mHandler;
public NoParamNoResultFragment(Handler handler) {
// Required empty public constructor
this.mHandler = handler;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_no_param_no_result, container, false);
view.findViewById(R.id.txt_handle).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Message message = mHandler.obtainMessage();
message.what = 0x123;
message.obj = "handle 通信";
mHandler.sendMessage(message);
}
});
view.findViewById(R.id.txt_noALl).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFunctionManager.invokeNoAll(MainActivity.FunctionNoParamNoResult);
}
});
view.findViewById(R.id.txt_result).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// mFunctionManager.invokeNoAll(MainActivity.FunctionNoParamNoResult);
String result = mFunctionManager.invokeWithResultOnly(MainActivity.FunctionWithResultOnly,String.class);
Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
}
});
view.findViewById(R.id.txt_param).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mFunctionManager.invokeWithParamOnly(MainActivity.FunctionWithParamOnly,"有参无返回值");
}
});
view.findViewById(R.id.txt_withAll).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String result = mFunctionManager.invokeWithAll(MainActivity.FunctionWithParamWithResult,String.class,"有参有返回值");
Toast.makeText(getActivity(), result, Toast.LENGTH_SHORT).show();
}
});
return view;
}
}
说明,上述在点击控件的时候,会触发在Activity添加的方法,这样就可以实现Activity与Fragment实时通信,近而实现Fragment之间的通信
https://gitee.com/lzbgit/AppInterface
架构师成长之路-基于android fragment通信的面向对象的万能接口的更多相关文章
- android--------实现Activity和Fragment通信的面向对象的万能接口
前言 开发一个app时,常用Activity和Fragment,由于操作方便Fragment越来越受欢迎,这样就避免不了Activity和Fragment.Fragment和Fragment之间的通信 ...
- 架构师成长之路7.1 CDN理论
点击返回架构师成长之路 架构师成长之路7.1 CDN理论 CDN,Content Distribute Network,内容分发网络:CDN解决的是如何将数据快速可靠从源站传递到用户的问题.用户获取数 ...
- 架构师成长之路3.1-Cobber原理及部署
点击返回架构师成长之路 架构师成长之路3.1-Cobber原理及部署 Cobbler是一个Linux服务器安装的服务,可以通过网络启动(PXE)的方式来快速安装.重装物理服务器和虚拟机,同时还可以管理 ...
- 架构师成长之路5.2-Saltstack远程执行
点击架构师成长之路 架构师成长之路5.2-Saltstack远程执行 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要FUNC工具配置才可以 ...
- 架构师成长之路5.6-Saltstack配置管理(jinja模板)
点击架构师成长之路 架构师成长之路5.6-Saltstack配置管理(jinja模板) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要FU ...
- 架构师成长之路5.5-Saltstack配置管理(状态间关系)
点击架构师成长之路 架构师成长之路5.5-Saltstack配置管理(状态间关系) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要FUNC ...
- 架构师成长之路5.4-Saltstack配置管理(LAMP架构案例)
点击架构师成长之路 架构师成长之路5.4-Saltstack配置管理(LAMP架构案例) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要F ...
- 架构师成长之路5.3-Saltstack配置管理(State状态模块)
点击架构师成长之路 架构师成长之路5.3-Saltstack配置管理(State状态模块) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需要 ...
- 架构师成长之路5.1-Saltstack安装及入门
点击架构师成长之路 架构师成长之路5.1-Saltstack安装及入门 (安装.配置.启动) 配置管理工具: Pupper:1. 采用ruby编程语言:2. 安装环境相对较复杂:3.不支持远程执行,需 ...
随机推荐
- [原创]CobaltStrike & Metasploit Shellcode一键免杀工具
CobaltStrike & Metasploit Shellcode一键免杀工具 作者: K8哥哥 图片 1个月前该工具生成的exe免杀所有杀软,现在未测应该还能过90%的杀软吧. 可选. ...
- [原创]k8exe2bat任意文件转Bat工具(WebShell无法上传EXE解决方案)
http://qqhack8.blog.163.com/blog/static/114147985201126105626755/ 这是我2011年的东西了,当时用此方法可免杀很多马,至今依然有很大的 ...
- C++版 - 剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题,ZOJ 1088:System Overload类似)题解
剑指Offer 面试题45:圆圈中最后剩下的数字(约瑟夫环问题) 原书题目:0, 1, - , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字.求出这个圈圈里剩下的最后一个数字 ...
- spring-boot-starter大力出奇迹
一.前言 上篇文章我们已经聊了SpringBoot的启动过程中的各类扩展点,那么从http://start.spring.io上我们生成的demo项目中,到目前就剩下了maven工程的pom.xm ...
- 浅析JavaScript之数组
一 概述 JavaScript数组同后端语言一样,具有它自己的数据结构,归根结底,这种数据结构,本质就是一种集合. 在后端语言中(如java,.net等),数组是这样定义的:数组是用来存储相同数据类 ...
- Spring Cloud Config采用数据库存储配置内容
在之前的<Spring Cloud构建微服务架构:分布式配置中心>一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储.这一设计巧妙的利用Gi ...
- @property详解,@property修饰符以及各个修饰符区别(上)
相信很多参加过面试的人员很多都会被问到:weak与assign的区别,copy与strong的区别.如果你仅仅说一点点copy一般对NSString,weak对于控件的修饰,assign对于基本类型, ...
- JavaScript数组入门。
JavaScript中的array对象就是数组,首先是一个动态数组,而且是一个像c#中 数组 arraylist hashtable等的综合体. var arr = [1, 7, 3, 4, 5]; ...
- C# 给一个控件去掉焦点
给一个控件去掉焦点(如选中控件按钮button时,按钮出现方框显示):例如给form这个窗体中的button按钮去焦点1.首先在form这个窗体中拖一个label按钮,去文字,设置背景为透明: 2.然 ...
- html 三列布局(两列自适应,一列固定宽度)
不做过多解释:主要是记录一个完整的布局样式,实现页面大致三列其中左右两列是自适应宽度,中间固定宽度效果. 不多少代码奉上: CSS样式代码: /******************** *公共标签样式 ...