AndroidLayoutToCode

Introduction: an android layout xml to kotlin anko plugin
More: Author   ReportBugs   
Tags:

项目介绍

一个将 android xml 逻辑完全映射为代码的插件

演示

关于创建项目,起始从 Gradle 建项目,再自己更改为 Plugin 插件项目 参考资料

以下 gradle task 配置为

task setup {
    dependsOn ideaModule, ideaProject
    doLast {
        copy {
            from '.'
            into '.idea/'
            include '*.ipr'
            rename { "modules.xml" }
        }
        project.delete "${project.name}.ipr"
    }
}
//这里将所有 module type:从 JAVA_MODULE 直接改为 PLUGIN_MODULE,因为使用 gradle 创建项目,而不是默认的 plugin 项目结构
idea.module.iml {
    withXml {
        println it.node
        it.node.@type = "PLUGIN_MODULE"
    }
}

其他步骤:

  • 手动打开 Module Setting,更改 project sdk 更改 Dependencies module sdk,必须更改为 java sdk+ plugin 插件 sdk 的共同依赖库
  • 打开 Edit Configurations 找到 plugin 项目模块,手动添加运行实例

> 以上为 gradle 项目更改 plugin 项目的做法,为的是引包,开发的便利,其实并不便利.但相比起 plugin 本身的项目模式,还是要便利很多的. 目前没有找到一键转换,以及自动添加运行实例的办法,非常抱歉

打包问题

out 目录为 plugin module 默认输出目录,可以通过其他方式修改, 但 build/prepare plugin module 默认会取此目录作为打包插件目录,所以直接将编译输出目录改为此目录

sourceSets {
    main {
        java.srcDirs = ['src/main/java']
        resources.srcDirs = ['src/main/resources']
        output.classesDir   = 'out/production/AndroidLayout2Anko'
        output.resourcesDir = 'out/production/AndroidLayout2Anko'
    }
}


2017/12/15 更新

  • 以上 gradle 构建暂停,因为无法与 plugin 项目完全贴近,导致启动时.无法调试.所以暂时以 plugin 项目直接开发
  • 检索 sdk26 内所有 java widget 源码,获得所有控件 attr 引用属性
  • parser 目录下为,正则分析所有 attr 并生成类代码
  • 在 iml 文件中添加 使之成为测试目录

2017/12/20

  • 代码生成了所有映射关系类
  • 完成了 View 类的所有属性映射
  • 完成了所有资源的逆向映射并抽离出 View 映射类,完成了此部分的解析测试

2017/1/29

  • 重启此项目,预计在本周完成第一版

2017/1/30

  • 重新更变控件所有引用属性.当前还剩下组合属性,设置方法

2017/2/2

  • 完成了 library 库 attrs 自动获取,以及本地 attrs 定义获取
  • 完成了基本的属性自动探测
  • 完成了第一个表单功能的研究.待实现具体逻辑

2018/2/22

  • 开年继续

2018/2/23

  • 完成自定义控件属性列展示
  • 完成自定义控件配置集(写入操作待调试)

2018/2/24

  • 改进一部分流程代码
  • 待重新构思自定义控件模块.

2018/2/25

  • 完成了系统控件继承树构成

2018/2/26

  • 重写了引用库自定义属性与控件的获取流程

2018/3/21

  • 适配 api27 所有系统控件,以及所有能转换的属性.并做尽可能大的逻辑转化
  • 提供了较为健全的属性,以及表达式扩展机制,可以方便添加并扩展转换逻辑

待完善

  1. xml 转 kotlin(逻辑己实现,有 idea 环境问题
  2. 自定义控件属性转换(己设计自定义控件转换模型)

包结构说明

  • action 为事件源
  • delegate 为工具定义,如弹出消息,刷新项目结构
  • exception 为自定义异常
  • context 为上下文场景匹配器
  • analysis 为自定义控件 module 数据分析包(暂未使用,自定义控件逻辑屏蔽)
  • form 设计一个 ui 界面
  • generate 代码合并生成模块(主要生成 java/kotlin 代码)
  • model 涉及部分对象体
  • prefs 为配置项
  • util 为一个扩展工具类

  • inflate

    • expression 表达式模块,为构建所有值,与生成语句的表达式扩展
      • value 为常规语句,其他为属性合并语句
    • impl 为映射系统的控件模块,映射了系统所有控件,以及配置属性,包括 LayoutParams
    • item 常规的数据
    • prefs 自定义控件配置
    • Views 为所有属性映射值类

测试类介绍

  • test/LayoutParser 测试 xml 解析
  • test/PlatformWidgetParserTest 为解析平台 Source 目录内 widget 源码,然后生成 anko 的映射解析类代码,构建类似 LayoutInflater 的解析机制代码
Support Me
Apps
About Me
Google+: Trinea trinea
GitHub: Trinea