# android-view-template
**Repository Path**: epii/android-view-template
## Basic Information
- **Project Name**: android-view-template
- **Description**: android的模板引擎,数据和模板绑定如此简单。
- **Primary Language**: Android
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2018-08-08
- **Last Updated**: 2020-12-17
## Categories & Tags
**Categories**: android-modules
**Tags**: None
## README
#模板引擎说明文档
*******************************************************************************
+ 什么是模板引擎?
模板引擎是以业务逻辑层和表现层分离为目的的,将规定格式的模板代码转换为业务数据的算法实现。
+ 为什么要用到模板引擎?
**举例:** 在我们做开发的时候,经常需要根据后台返回的数据来给控件赋值。
通常我们是这样做的 ↓
```
```
```
//代码中
TextView mTextView = findViewById(R.id.mTextView);
mTextView.setText(datas.get("key"));
```
这样做 也非常规范、也非常正确、也非常没有毛病。
但是呢!在我们开发的时候不可能就只有这一两个控件让你赋值吧...
```
public void initView(View view) {
rl_gonggao = (RelativeLayout) view.findViewById(R.id.rl_gonggao);
rollPagerView = (RollPagerView) view.findViewById(R.id.rollPagerView);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
gridView = (MyGridView) view.findViewById(R.id.gridView);
search_edit = (EditText) view.findViewById(R.id.search_edit);
tv_gonggao = (TextView) view.findViewById(R.id.tv_gonggao);
tv_xinpintuijian = (TextView) view.findViewById(R.id.tv_xinpintuijian);
tv_cainixihuan = (TextView) view.findViewById(R.id.tv_cainixihuan);
tv_fl1 = (TextView) view.findViewById(R.id.tv_fl1);
tv_fl2 = (TextView) view.findViewById(R.id.tv_fl2);
tv_fl3 = (TextView) view.findViewById(R.id.tv_fl3);
tv_fl4 = (TextView) view.findViewById(R.id.tv_fl4);
tv_quanbu = (TextView) view.findViewById(R.id.tv_quanbu);
img_fl1 = (ImageView) view.findViewById(R.id.img_fl1);
img_fl2 = (ImageView) view.findViewById(R.id.img_fl2);
img_fl3 = (ImageView) view.findViewById(R.id.img_fl3);
img_fl4 = (ImageView) view.findViewById(R.id.img_fl4);
img_quanbu = (ImageView) view.findViewById(R.id.img_quanbu);
img_dalibao = (ImageView) view.findViewById(R.id.img_dalibao);
rl_shenghuo = (RelativeLayout) view.findViewById(R.id.rl_shenghuo);
rl_shuma = (RelativeLayout) view.findViewById(R.id.rl_shuma);
rl_shipin = (RelativeLayout) view.findViewById(R.id.rl_shipin);
rl_fuzhuang = (RelativeLayout) view.findViewById(R.id.rl_fuzhuang);
rl_quanbu = (RelativeLayout) view.findViewById(R.id.rl_quanbu);
bg_content = (ScrollView) view.findViewById(R.id.bg_content);
bar = (LinearLayout) view.findViewById(R.id.bar);
}
```
↑ 这才是我们实际开发时的情况...
我们的大部分工作都是在 findViewById() , mTextView.setText();
大大的降低了工作效率,代码屯余量高,浪费时间,而且还影响心情。
那我们可不可以有个什么东西,替我们干这些工作呢?
答案是肯定的,这就是我们的 **模板引擎** 。
我们只需要在控件属性里设置一个key,然后就可以自动绑定数据,省时省力 提高效率!
************************************************************************
+ 先来看看简单用法
```
```
```
//代码中
HashMap data = new HashMap<>();
data.put("name","张三");
data.put("age","19岁");
WsViewTools.renderView(this,findViewById(R.id.acv),data);
```
就是这么简单,我们只需要在Activity中绑定一下数据:
`WsViewTools.renderView(this,findViewById(R.id.acv),data);`
xml中 `ws:wsValue="name"` 。这样就可以把“张三”直接设置到对应的TextView中。
是不是特别简单! 当然这样还不够
************************************************************************
#下面我们来说说这个模板引擎的完整用法 ↓
+ 前期准备:
1. 在自己的 *Application* 中的 *onCreate* 方法中定义:
```
WsViewInit.setWsViewLisenter(new WsViewInit.IWsViewLisenter() {
@Override
public void onImage(ImageView imgview, String url) {
//这里是你对图片的处理方式,自己定义,我这里是演示直接显示。
Picasso.with(context).load(url).into(imgview);
}
@Override
public void onChange(Context context, String click_to_change) {
//这里是你对点击事件的处理方式,自己定义,我这里是演示打印。
// "click_to_change" 是后台某一字段的数据
System.out.println(click_to_change);
}
});
2. 在Activity中绑定数据:
```
/**
*第一个参数 Context
*第二个参数 View 要绑定的模板
*第三个参数 HashMap data 你的数据
*/
WsViewTools.renderView(this, findViewById(R.id.acv), data);
```
+ 接下来就是绑定数据了:
**先模拟数据:**
```
HashMap data = new HashMap<>();
data.put("name","张三");
data.put("age","19岁");
data.put("link","http://www.baidu.com");
data.put("img", "https://imgsa.baidu.com/exp/w=480/sign=61953a69ab345982c58ae49a3cf4310b/95eef01f3a292df516b60208ba315c6034a873b2.jpg");
data.put("isShow","1");
data.put("isHide","0");
```
+ ### **TextView:**
```
```
设置值就是: ` ws:wsValue=" 对应的key " `
点击事件 : ` ws:wsClickToChange=" 对应的key "`
判断隐藏或显示: `ws:wsShowIf="{对应的key}.equals(1)" `
如果为1就显示,终于不用再代码中判断了,非常方便!
1. 这个点击的方式就是把“link”的值,传到咱们第一步*Application* 中的 *onChange* 回调方法里,
然后你自己根据需求进行解析处理。上面的代码为了演示打印了一下,当我点击TextView时,
会打印出 "http://www.baidu.com"。
2. 还有一种点击方式: `ws:wsClickToFunction="fun?click={name}"`
```
//代码中
public void fun(View view, HashMap data) {
//Toast出来的值是: fun: 张三
Toast.makeText(this, "fun: " + data.get("click"), Toast.LENGTH_SHORT).show();
}
```
解释一下:
`"fun?click={name}&age={age}&img={img}" ` 这是可以拼多个值的。
"fun?click={name}" ==>> 方法名 ? 要获取数据的key = {HashMap中的key}
data.get("要获取数据的key"),这样我们就可以直接拿到值,不用再去弄个全局变量什么的来回传。
**这样就做到了业务逻辑层和表现层的分离。**
+ ### **ImageView:**
和*TextView*的用法一样,属性值填上*key*,在*Application* 中的 *onImage* 回调方法里进行处理,
当然怎么处理是你的事儿了,跟我没关系,我这只是演示。
```
```
*******************************************************