依赖
种子工程的app/imunutable/libs/MADCore_GREEN.aar
为MADP3.0 SDK,后续会间断性的提供完善版本。
此外在build.gradle的dependencies
节点中添加以下依赖。
dependencies {
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:recyclerview-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.github.bumptech.glide:glide:4.9.0'
implementation 'com.alibaba:fastjson:1.2.83'
}
注册表
将registry.dat
放到assets
目录下
更多注意事项请参考文档 SDK集成与使用手册
EnvironmentConfig config = new EnvironmentConfig.Builder()
.setOpenLog(false)
.setOpenCockroach(false)
.setUsePortService(false)
.setLaunchModel(MADConfig.LaunchModel.SYNC)
.setHttpProxy("")
.setGrayFlag(0)
.setCustomHttpAdapter(null)
.setNeedDeviceID(true)
.setNeedVerifyProcessInfo(true)
.build();
Engine.initEnvironment(app, config, callback);
public class MADCompEngine
入口类,主要用于初始化以及注册自定义容器、组件
返回值 | 方法名称 |
---|---|
void | init() |
void | registerContainer(String type, Class<? extends MADContainer> clazz) |
void | registerComponent(String type, Class<? extends MADComponent> clazz) |
void | registerNTBItemView(String type, Class<? extends NTBItemView> clazz) |
void | registerTitleItemView(String type, Class<? extends MADTitleItemComponent> clazz) |
初始化,并注册内置组件,
**注意:**MADP初始化时已经调用,您无需使用该接口,此处仅做说明。
public static void registerContainer(String type, Class<? extends MADContainer> clazz)
注册自定义容器
类型 | 说明 |
---|---|
type | 容器类型,与后管中的pageType保持一致 |
clazz | 自定义容器Class,需要继承MADContainer,详情参考MADContainer.class说明 |
public static void registerComponent(String type, Class<? extends MADComponent> clazz)
注册自定义组件
类型 | 说明 |
---|---|
type | 组件类型,与后管中的type保持一致 |
clazz | 自定义组件Class,需要继承MADComponent,详情参考MADComponent.class说明 |
public static void registerNTBItemView(String type, Class<? extends NTBItemView> clazz)
注册自定义导航栏item样式
类型 | 说明 |
---|---|
type | 导航栏按钮类型,与后管中的type保持一致 |
clazz | 自定义导航栏item Class,需要继承NTBItemView,详情参考NTBItemView.class说明 |
public static void registerTitleItemView(String type, Class<? extends MADTitleItemComponent> clazz)
注册自定义导航栏item样式
类型 | 说明 |
---|---|
type | 标题按钮类型,与后管中的type保持一致 |
clazz | 自定义标题栏按钮Class,需要继承MADTitleItemComponent,详情参考MADTitleItemComponent.class说明 |
public interface IActivityStateListener
Activity生命周期监听回调。
返回类型 | 方法 |
---|---|
void | onActivityCreate() |
void | onActivityStart() |
void | onActivityPause() |
void | onActivityResume() |
void | onActivityStop() |
void | onActivityDestroy() |
boolean | onActivityBack() |
void | onActivityResult(int requestCode, int resultCode, Intent data) |
public abstract class MADContainer implements IActivityStateListener
容器:页面基础,加载组件的载体,此类代表容器基础模块,自定义容器需要继承MADContainer
;
已实现的容器
类型 | 说明 |
---|---|
tab | 导航栏,目前仅用于首页 |
listPage | 首页列表 |
splash | 闪屏 |
errorpage | 错误页面 |
返回类型 | 方法名称 |
---|---|
View | viewContainer(Context context, Object data) |
void | addComponent(MADComponent component) |
void | addContainer(MADContainer container) |
ContextPool.MADContext | getMadContext() |
void | destroy() |
void | onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder) |
void | onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder) |
void | onViewRecycled(Context context, RecyclerView.ViewHolder holder) |
public View viewContainer(Context context, Object data)
绘制容器
参数
类型 | 说明 |
---|---|
context | android.content.Context |
data | 容器数据,解析后管配置,包括宽高、背景色等 |
返回值
View:返回当前容器View,SDK会将View添加到对应的ViewGroup中。
public void addComponent(MADComponent component)
添加当前容器内需要渲染的组件
参数
参数 | 说明 |
---|---|
component | 继承了MADComponent的class |
public void addContainer(MADContainer container)
添加当前容器需要嵌套的子容器
参数
参数 | 说明 |
---|---|
container | 继承了MADContainer的Class |
public ContextPool.MADContext getMadContext()
获取MADContext对象,使用场景、持久化存储等API
参数 无
public void destroy()
销毁当前容器,自定义容器需要在此处回收资源
参数
无
public void onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder)
组件在RecyclerView中展示,仅容器内引用RecyclerView时需要实现此接口。
参数
参数 | 说明 |
---|---|
context | android.content.Context实例 |
holder | ViewHolder实例 |
public void onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder)
组件在RecyclerView中隐藏,仅容器内引用RecyclerView时需要实现此接口。
参数
参数 | 说明 |
---|---|
context | android.content.Context实例 |
holder | ViewHolder实例 |
public void onViewRecycled(Context context, RecyclerView.ViewHolder holder)
组件被RecyclerView回收,仅容器内引用RecyclerView时需要实现此接口。
参数
参数 | 说明 |
---|---|
context | android.content.Context实例 |
holder | ViewHolder实例 |
public abstract class MADComponent implements IActivityStateListener
此类代表组件基础模块,自定义组件需要继承MADComponent
。
已实现的组件
组件 | 描述 |
---|---|
banner | 轮播广告 |
richText | 画布 |
menu | 菜单 |
notice | 公告 |
dynamicCar | 动态卡 |
返回类型 | 方法 |
---|---|
RecyclerView.ViewHolder | onCreateViewHolder(@NonNull ViewGroup viewGroup, Object data) |
void | onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, Object data) |
void | onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder) |
void | onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder) |
void | onViewRecycled(Context context, RecyclerView.ViewHolder holder) |
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, Object data)
创建一个新的ViewHolder
并初始化一些供RecyclerView使用,组件是首页楼层类型时,必须实现此接口
参数
类型 | 说明 |
---|---|
viewGroup | ViewGroup |
data | 组件数据,解析后管配置,包括宽高、背景色等 |
返回值
RecyclerView.ViewHolder:用于RecyclerView.Adapter添加组件。
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, Object data)
更新组件数据
参数
类型 | 说明 |
---|---|
viewHolder | 组件 VH |
data | 组件数据,解析后管配置,包括宽高、背景色等 |
public void onViewAttachedToWindow(Context context, RecyclerView.ViewHolder holder)
当此适配器创建的视图已附加到窗口时调用
参数
类型 | 说明 |
---|---|
context | android.content.Context |
holder | 组件 VH,所附加视图的持有者 |
public void onViewDetachedFromWindow(Context context, RecyclerView.ViewHolder holder)
当此适配器创建的视图已与其窗口分离时调用
参数
类型 | 说明 |
---|---|
context | android.content.Context |
holder | 组件 VH,所附加视图的持有者 |
public void onViewRecycled(Context context, RecyclerView.ViewHolder holder)
当此适配器创建的视图已被回收时调用。
参数
类型 | 说明 |
---|---|
context | android.content.Context |
holder | 组件 VH,所附加视图的持有者 |
public abstract class MADSingleComponent extends MADComponent
MADComponent的子类,包含MADComponent的接口,用于特殊组件的开发。
已实现的组件:
组件 | 说明 |
---|---|
adbanner | 首页弹窗广告 |
exitalert | 首页返回退出提示弹窗 |
adfloat | 首页悬浮按钮 |
update | 更新提示组件 |
返回类型 | 方法 |
---|---|
void | onCreate(Context context, ViewGroup parent, Object data) |
public abstract void onCreate(Context context, ViewGroup parent, Object data);
参数
参数 | 说明 |
---|---|
context | android.content.Context 实例 |
parent | 父容器 |
data | 组件数据,包括宽高、背景色等配置数据 |
public abstract class NTBItemView extends RecyclerView.OnScrollListener
导航栏自定义item模板。
已实现的组件:
组件 | 说明 |
---|---|
normal | 常用标准组件:上图下文 |
special | 特殊组件,单独大图 |
返回类型 | 方法 |
---|---|
View | createView(ViewGroup viewGroup, NTBModel.NTBItemModel itemModel,boolean selected); |
void | setSelected(boolean selected); |
void | onItemClick() |
void | onScrolled(RecyclerView recyclerView, int dx, int dy) |
public abstract View createView(ViewGroup viewGroup, NTBModel.NTBItemModel itemModel,boolean selected);
参数
参数 | 说明 |
---|---|
viewGroup | 父容器视图 |
itemModel | 数据模型 |
selected | 是否被选中 |
public abstract void setSelected(boolean selected);
选中状态,根据selected更新按钮ui
参数
参数 | 说明 |
---|---|
selected | 是否被选中 |
public boolean onItemClick();
item点击事件,当item需要自定义点击事件时,返回true,并添加自定义逻辑,否则返回false,由标题栏执行默认操作(切换tab)
返回值
参数 | 说明 |
---|---|
true | 需要item自定义点击事件 |
false | 不需要item自定义点击事件 |
public void onScrolled(RecyclerView recyclerView, int dx, int dy)
对应列表滚动事件,若想事项导航栏按钮与列表的联动,需要实现此接口
参数 | 说明 |
---|---|
recyclerView | RecyclerView实例 |
dx | 横向滚动偏移量 |
dy | 纵向滚动偏移量 |
public abstract class MADTitleItemComponent extends MADComponent
MADComponent的子类,包含MADComponent的接口,当内置的标题栏无法满足UI设计时可以继承此类。
已实现的组件:
组件 | 说明 |
---|---|
image | 图标 |
返回类型 | 方法 |
---|---|
View | createView(Context context, TitleItemModel model); |
public abstract View createView(Context context, TitleItemModel model);
参数
参数 | 说明 |
---|---|
context | android.content.Context 实例 |
model | 后管数据 |
客户端将接口回调给前端
方法
返回值 | 方法 |
---|---|
void | onCallBack(String data) |
public void onCallBack(String data);
当客户端在BaseBridgeHandler插件中完成业务流程处理后,将结果通过onCallBack返回给前端
参数 | 说明 |
---|---|
data | 需要传递给前端的数据 |
插件模板,自定义的插件需要继承自BaseBridgeHandler。
变量
变量名 | 类型 | 说明 |
---|---|---|
mActivity | android.app.Activity | 当前插件所在的Activity实例 |
methodName | String | 当前插件的名称 |
方法
返回值 | 方法 |
---|---|
void | handler(String data, CallBackFunction function) |
void | onActivityResult(int requestCode, int resultCode, Intent data) |
public abstract void handler(String data, CallBackFunction function);
H5交互时会触发handler(String data, CallBackFunction function)
参数
参数 | 说明 |
---|---|
data | 前端传递到原生的数据 |
function | 当业务数据处理完成后,将需要处理的数据通过function传递给前端 |
public void onActivityResult(int requestCode, int resultCode, Intent data)
如果在插件中使用到了startActivityForResult
,需要重写onActivityResult方法,需要注意比对requestCode
参数 | 说明 |
---|---|
requestCode | 请求码 |
resultCode | 返回码 |
data | 返回数据 |
1)创建组件
创建类PlaceHolderComponent
,继承MADComponent
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import tech.madp.core.utils.MADPLogger;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.alibaba.fastjson.JSONObject;
import tech.madp.core.component.R;
import tech.madp.core.component.common.MADComponent;
import tech.madp.core.component.model.ComponentModel;
public class PlaceHolderComponent extends MADComponent {
private static final String TAG = "PlaceHolderComponent";
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, Object data) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.components_placeholder, viewGroup, false);
return new PlaceHolderViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, Object data) {
MADPLogger.d(TAG, "onBindViewHolder: viewHolder = " + viewHolder + ", data = " + data);
if (viewHolder instanceof PlaceHolderViewHolder) {
}
}
public static class PlaceHolderViewHolder extends RecyclerView.ViewHolder {
public PlaceHolderViewHolder(View v) {
super(v);
}
}
}
2)注册组件
在应用启动时(Application或LaunchActivity)注册组件PlaceHolderComponent
MADCompEngine.registerComponent("test", PlaceHolderComponent.class);
1)创建组件
创建类TitleImgComponent
,继承MADTitleItemComponent
import android.content.Context;
import android.view.View;
import android.widget.ImageView;
import tech.madp.core.component.common.MADTitleItemComponent;
import tech.madp.core.component.model.TitleItemModel;
import tech.madp.core.component.utils.ActionTool;
import tech.madp.core.component.utils.ImgTool;
public class TitleImgComponent extends MADTitleItemComponent {
@Override
public View createView(Context context, TitleItemModel model) {
ImageView imageView = new ImageView(context);
ImgTool.setImageBg(context, imageView, model.getImage());
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActionTool.open(model.getAction());
}
});
return imageView;
}
}
2)注册组件
在应用启动时(Application或LaunchActivity)注册组件MADTitleItemComponent
MADCompEngine.registerTitleItemView("image", TitleImgComponent.class);
1)创建组件
创建类NormalNTBItemView
,继承NTBItemView
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import tech.madp.core.component.R;
import tech.madp.core.component.model.NTBModel;
import tech.madp.core.component.utils.ColorTool;
import tech.madp.core.component.utils.DimenTool;
import tech.madp.core.component.utils.ImgTool;
import tech.madp.core.component.utils.TextTool;
public class NormalNTBItemView extends NTBItemView {
private NTBModel.NTBItemModel itemModel;
private TextView spaceItemText;
private ImageView spaceItemIcon;
private Context context;
@Override
public View createView(ViewGroup viewGroup, NTBModel.NTBItemModel itemModel, boolean selected) {
context = viewGroup.getContext();
this.itemModel = itemModel;
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout.LayoutParams textAndIconContainerParams = new LinearLayout.LayoutParams(
0, itemModel.getTabHeight(), 1);
RelativeLayout textAndIconContainer = (RelativeLayout) inflater.inflate(R.layout.comp_ntb_normal_item_view, viewGroup, false);
textAndIconContainer.setLayoutParams(textAndIconContainerParams);
textAndIconContainer.setBackgroundColor(ColorTool.toColorInt(itemModel.getBackgroundColor(), Color.WHITE));
spaceItemIcon = (ImageView) textAndIconContainer.findViewById(R.id.space_icon);
spaceItemText = (TextView) textAndIconContainer.findViewById(R.id.space_text);
ImgTool.setImageBg(context, spaceItemIcon, itemModel.getImg());
spaceItemText.setText(itemModel.getName());
spaceItemText.setTextSize(itemModel.getFontsize());
if (itemModel.getIndexID() != -1)
textAndIconContainer.setId(itemModel.getIndexID());
if (TextTool.isEmpty(itemModel.getImg()))
Utils.changeViewVisibilityGone(spaceItemIcon);
ViewGroup.LayoutParams iconParams = spaceItemIcon.getLayoutParams();
int size = DimenTool.mad2px(itemModel.getImgSize()) == 0 ? ViewGroup.LayoutParams.WRAP_CONTENT : DimenTool.mad2px(itemModel.getImgSize());
iconParams.height = size;
iconParams.width = size;
spaceItemIcon.setLayoutParams(iconParams);
if (TextTool.isEmpty(itemModel.getName())) {
Utils.changeViewVisibilityGone(spaceItemText);
}
setSelected(selected);
return textAndIconContainer;
}
@Override
public void setSelected(boolean selected) {
if (spaceItemIcon == null || spaceItemIcon == null)
return;
if (selected) {
spaceItemText.setTextColor(ColorTool.toColorInt(itemModel.getSelectedColor()));
ImgTool.setImageBg(context, spaceItemIcon, itemModel.getSelectedImg());
} else {
spaceItemText.setTextColor(ColorTool.toColorInt(itemModel.getUnselectedColor()));
ImgTool.setImageBg(context, spaceItemIcon, itemModel.getImg());
}
}
}
2)注册组件
在应用启动时(Application或LaunchActivity)注册组件NormalNTBItemView
MADCompEngine.registerNTBItemView("normal", NormalNTBItemView.class);
1)创建插件
创建类TestBridgeHandler
,继承BaseBridgeHandler
import com.alibaba.fastjson.JSONObject;
import tech.madp.core.component.utils.TextTool;
import tech.madp.core.jsbridge.BaseBridgeHandler;
import tech.madp.core.jsbridge.CallBackFunction;
public class TestBridgeHandler extends BaseBridgeHandler {
@Override
public void handler(String data, CallBackFunction function) {
String result = "test data";
function.onCallBack(handlerSuccess(result).toJSONString()); //回传数据给js
}
private JSONObject handlerSuccess(String data) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("state", "success");
jsonObject.put("data", data);
return jsonObject;
}
private JSONObject handlerFail(String msg) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("state", "fail");
if (!TextTool.isEmpty(msg))
jsonObject.put("errMsg", msg);
return jsonObject;
}
}
2)注册插件
在应用启动时(Application或LaunchActivity)注册组件TestBridgeHandler
BridgeHandlerManager.registerHandler("test", TestBridgeHandler.class);