• 配置文件编写

        “模版组件”之所以被冠以“模版”二字是因为在一个模版组件开发完成之后,可能会被多个项目使用。但是不同的项目往往对于一个组件往往是有一些客制化需求的,比如一个Button有的项目想要使用红色,有的项目想要使用蓝色。有的项目想要使用这个图片,有的项目想要使用那个图片。我们使用如下方式完成可配置化,在打包期间,“Hippius打包平台”将客制化需求以参数的方式传递给“打包脚本”,打包脚本处理参数后,将文件类型参数(如图片)直接放到开发人员需要的文件夹中,将value类型参数放到env_config.gradle文件夹中。

    1、 创建一个名为“template_config.json”的文件,该文件是告知打包平台有哪些元素可以配置,打包平台通过该配置文件渲染配置页面使用。

    {
      //pageCode使用Library的名称,为了便于管理,该名称与iOS端保持一致
      "pageCode": "hippiusmoduledemo",
      //集成开发打包模式下tab页使用“function”,目前仅有“function”
      "pageType": "function",
      //固定为“native”
      "pageSort": "native",
      //名称随意
      "pageName": "Demo模版",
      //可配置化字段放于该处,后面会展开将
      "params": {
        "rows": [
        ]
      },
      "extra": {
        //Library名称,注意加冒号
        "AndroidLibrary": ":hippiusmoduledemo",
        //该组件的版本
        "AndroidLibVersion": "1.0.0",
        //“组件开发”时第3步创建的fragment的路由
        "AndroidRoute": "/hippiusmodluedemo/demofragment"
      }
    }
    
    {
        //默认值
        "defaultValue": "",
        //输入限制
        "paramJson": "{}",
        //配置项的显示名称
        "keyName": "Demo字符串1",
        //配置项的类型如字符串为“input”,多选为checkbox
        "type": "",
        //配置项的key,注意使用“组件名称”+"自定义名称"的形式
        "key": "hippiusmoduledemo_str1",
        //是否必输
        "required": "Y",
        //配置项描述
        "desc": "请输入测试字符串1"
    }
    
    {
      "pageCode": "hippiusmoduledemo",
      "pageType": "function",
      "pageSort": "native",
      "pageName": "Demo模版",
      "params": {
        "rows": [
          {
            "defaultValue": "测试字符串1的默认值",
            "paramJson": "{\"length\":3}",
            "keyName": "Demo字符串1",
            "type": "input",
            "key": "hippiusmoduledemo_str1",
            "required": "Y",
            "desc": "请输入测试字符串1"
          },
          {
            "defaultValue": "测试字符串2的默认值",
            "paramJson": "{}",
            "keyName": "Demo字符串2",
            "type": "input",
            "key": "hippiusmoduledemo_str2",
            "required": "Y",
            "desc": "请输入测试字符串2"
          },
          {
            "defaultValue": "#FFFFFF",
            "paramJson": "{}",
            "keyName": "Demo颜色1",
            "type": "colorPicker",
            "key": "hippiusmoduledemo_color1",
            "required": "Y",
            "desc": "Demo颜色1"
          },
          {
            "defaultValue": "#FFFFFF",
            "paramJson": "{}",
            "keyName": "Demo颜色2",
            "type": "colorPicker",
            "key": "hippiusmoduledemo_color2",
            "required": "Y",
            "desc": "Demo颜色1"
          },
          {
            "defaultValue": null,
            "paramJson": "{\"requiredType\":[\"png\",\"jpng\"],\"size\":{\"height\":100,\"width\":300}}",
            "keyName": "示例图片1",
            "type": "uploadImage",
            "key": "hippiusmoduledemo_img_1",
            "required": "N",
            "desc": "推荐尺寸 300*100"
          },
          {
            "defaultValue": "[]",
            "paramJson": "[{\"label\":\"区域1\",\"value\":\"area1\"},{\"label\":\"区域2\",\"value\":\"area2\"},{\"label\":\"区域3\",\"value\":\"area3\"}]",
            "keyName": "显示区域选择",
            "type": "checkbox",
            "key": "hippiusmoduledemo_checkbox_area",
            "required": "N"
          },
          {
            "defaultValue": "area1",
            "paramJson": "[{\"label\":\"区域1\",\"value\":\"area1\"},{\"label\":\"区域2\",\"value\":\"area2\"},{\"label\":\"区域3\",\"value\":\"area3\"}]",
            "keyName": "显示区域单选",
            "type": "radio",
            "key": "hippiusmoduledemo_radio_area",
            "required": "Y"
          },
          {
            "paramJson": "{\"length\":50}",
            "keyName": "长文本示例",
            "type": "textarea",
            "key": "hippiusmoduledemo_textarea1",
            "required": "N",
            "desc": "请输入(1-50汉字)"
          }
        ]
      },
      "extra": {
        "AndroidLibrary": ":hippiusmoduledemo",
        "AndroidLibVersion": "1.0.0",
        "AndroidRoute": "/hippiusmodluedemo/demofragment"
      }
    }
    
    图3.1

    2、 Hippius打包平台通过template_config.json文件可以得知如何渲染页面,它会将用户勾选或输入的参数传递给打包脚本。打包脚本如何知道将这些参数放置到模版组件的的哪里呢?我们需要创建一个映射文件mapping_config.json

    {
      //Library的名称    
      "pageCode":"hippiusmoduledemo",
      //files处理文件类型的配置项
      "files":[
        {
          //对应template_config.json中params里的key
          "keyRoute": "params.hippiusmoduledemo_img_1",
          //打包脚本会将key对应的图片放到组件中的“targetPath"路径
          "targetPath": "hippiusmoduledemo/src/main/res/drawable-xxhdpi/demo_img1.png"
        }
      ],
      //值类型的参数
      "keyValues":[
        {
          //对应template_config.json中params里的key 
          "keyRoute": "params.hippiusmoduledemo_str1",
          //输出的类型目前支持string和JSONArray
          "type": "string",
          //默认值
          "default":null,
          //必须以library名+自定义名命名。打包脚本会将keyRoute对应的值填入到env_config.json中
          "targetKey": "hippiusmoduledemo_str1"
        },
        {
          "keyRoute": "params.hippiusmoduledemo_str2",
          "type": "string",
          "default":null,
          "targetKey": "hippiusmoduledemo_str2"
        },
        {
          "keyRoute": "params.hippiusmoduledemo_color1",
          "type": "string",
          "default":"#FFFFFF",
          "targetKey": "hippiusmoduledemo_color1"
        },
        {
          "keyRoute": "params.demo_color2",
          "type": "string",
          "default":"#000000",
          "targetKey": "hippiusmoduledemo_color2"
        },
        {
          "keyRoute": "params.hippiusmoduledemo_checkbox_area",
          "type": "JSONArray",
          "default":null,
          "targetKey": "hippiusmoduledemo_checkbox_area"
        },
        {
          "keyRoute": "params.hippiusmoduledemo_radio_area",
          "type": "string",
          "default":null,
          "targetKey": "hippiusmoduledemo_radio_area"
        },
        {
          "keyRoute": "params.hippiusmoduledemo_textarea1",
          "type": "string",
          "default":null,
          "targetKey": "hippiusmoduledemo_textarea1"
        }
      ]
    }
    

    文件类型的参数已被放到模版组件的对应位置,值类型参数生成的env_config.gradle如下所示

    ext {
      hippiusmoduledemo_str1 = "可配置内容1"
      hippiusmoduledemo_str2 = "可配置内容2"
      hippiusmoduledemo_color1 = "#FF00FF"
      hippiusmoduledemo_color2 = "#00FF00"
      hippiusmoduledemo_checkbox_area = ["area1"]
      hippiusmoduledemo_radio_area = ["area2"]
      hippiusmoduledemo_textarea1 = "可配置长文字内容"
    }
    

    3、 对于值类型的参数我们要如何使用呢?仅需在gradle中做简单应用,gradle会为我们自动生成代码。

    图3.2

    在代码中我们就可以直接应用这些配置的参数了 如:

    protected void onBindView(@Nullable Bundle savedInstanceState) {
            tvToken.setText(Hippius.getAccessToken());
            tvUserId.setText(SPConfig.getString(ConfigKeys.SP_USERID,""));
            tvStr1.setText(BuildConfig.demo_str1);
            tvStr2.setText(BuildConfig.demo_str2);
            vColor1.setBackgroundColor(Color.parseColor(BuildConfig.demo_color1));
            vColor2.setBackgroundColor(Color.parseColor(BuildConfig.demo_color2));
            String demo_checkbox_area = BuildConfig.demo_checkbox_area;
            try {
                JSONArray array = new JSONArray(demo_checkbox_area);
                for(int i = 0;i<array.length();i++){
                  if(array.optString(i,"").equals("area1")){
                      tvArea1.setVisibility(View.VISIBLE);
                  }else if(array.optString(i,"").equals("area2")){
                      tvArea2.setVisibility(View.VISIBLE);
                  }else if(array.optString(i,"").equals("area3")){
                      tvArea3.setVisibility(View.VISIBLE);
                  }
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            String radio_area = BuildConfig.demo_radio_area;
            if("area1".equals(radio_area)){
                tvRadioArea1.setVisibility(View.VISIBLE);
            }else if("area2".equals(radio_area)){
                tvRadioArea2.setVisibility(View.VISIBLE);
            }else if("area3".equals(radio_area)){
                tvRadioArea3.setVisibility(View.VISIBLE);
            }
            tvLongArea1.setText(BuildConfig.demo_textarea1);
        }