一,原有模板分析 模板存放路径: android-studio\plugins\android\lib\templates,模板包内的文件: Android Studio自定义模板:简单自定义DeviceAdminReceiver模板_第1张图片 (1).globals.xml.ftl   存放的是一些自定义的和引用的全局变量
                           有manifes文件时需要   有src类文件需要用到res资源需要                  ${relativePackage}<#else>${packageName}" />包             <#include "../common/common_globals.xml.ftl" />引用的全局变量,               Android Studio自定义模板:简单自定义DeviceAdminReceiver模板_第2张图片          (2).template.xml(    EmptyActivity模板为例              Android Studio自定义模板:简单自定义DeviceAdminReceiver模板_第3张图片          Android Studio自定义模板:简单自定义DeviceAdminReceiver模板_第4张图片               (3).recipe.xml.ftl             
                           <#if useFragment>     <#include "recipe_fragment.xml.ftl" /> <#else>     <#include "../common/recipe_simple.xml.ftl" />                                 from="root/res/drawable-hdpi" to="${escapeXmlAttribute(resOut)}/drawable-hdpi" /> <merge from="root/${resIn}/values/strings.xml.ftl" to="${escapeXmlAttribute(resOut)}/values/strings.xml" />                                                                              
  • <#if ...>...<#else>  ...     : if语法
  • #include:引用的文件或资源文件
  • copy :从root中copy文件到我们的目标目录,比如我们的模板Activity需要使用一些图标,那么可能就需要使用copy标签将这些图标拷贝到我们的项目对应文件夹。
  • merge : 合并的意思,比如将我们使用到的strings.xml合并到我们的项目的stirngs.xml中
  • instantiate : 和copy类似,但是可以看到上例试将ftl->java文件的,也就是说中间会通过一个步骤,将ftl中的变量都换成对应的值,那么完整的流程是ftl->freemarker process -> java
  • open:在代码生成后,打开指定的文件,比如我们新建一个Activity后,默认就会将该Activity打开。

Android Studio自定义模板 写页面竟然可以如此轻松 - Hongyang

总结:

内部机制:声明变量:global.xml.ftl-----获取参数:template.xml-----模板事件:root目录-----模板变现:recipe.xml.ftl 变现流程:ftl->freemarker process->项目中的代码/资源/文件 二,简单自定义模板: DeviceAdminReceiver 1, copy一份BroadcastReceiver模板命名为DeviceAdminReceiver,(个人喜好使用Notepad++编辑) 2, 修改\android-studio\plugins\android\lib\templates\other\BroadcastReceiver.java.ftl,文件名和文件中的BroadcastReceiver替换为DeviceAdminReceiver,\Android\android-studio\plugins\android\lib\templates\other\DeviceAdminReceiver.java.ftl:
    
package ${packageName};
import android.app.admin.DeviceAdminReceiver;
public class ${className} extends DeviceAdminReceiver {
    public ${className}() {
    }
//代码
}

3, 创建\android-studio\plugins\android\lib\templates\other\DeviceAdminReceiver\root\res\xml文件夹,创建一个管理配置文件device_admin_receiver.xml.ftl:
    
    
    
    
<?xml version="1.0" encoding="utf-8"?>

  
    
    
    
    
    
    
    
    
  
4, 修改\android-studio\plugins\android\lib\templates\other\DeviceAdminReceiver\root\AndroidManifest.xml.ftl文件:
    
    

    

            android:exported="${isExported?string}"
            android:enabled="${isEnabled?string}" 
            android:label="组件名字"
            android:permission="android.permission.BIND_DEVICE_ADMIN" >
            
                android:name="android.app.device_admin"
                android:resource="@xml/device_admin_receiver" />
            
                
            
        
    

5, 修改globals.xml.ftl文件,这时候我们应该明白增加了哪些内容,分析原来的变量声明,有manifestOut,srcOut,relativePackage,而我们增加使用了res资源文件,相比较于srcOut,我们应该也声明resOut,怎么声明:参考其他模板。得到的globals.xml.ftl为:
    
<?xml version="1.0"?>

    
    

    ${relativePackage}<#else>${packageName}" />

6,修改template.xml文件,参考其他模板和原模板界面显示稍微改动就好了,最简单的只需改个名字就好了,这里除名字外,我修改了两处, 一处增加了类别属性,也为另一个BroadcastReceiver增加了属性,这个效果在上面第四张图可以看到,Other下面增加了个Receiver,Receiver包含两个模板;另一处增加了package块,下面就可以看到效果
    
<?xml version="1.0"?>

    format="5"
    revision="3"
    name="DeviceAdminReceiver"
    description="Creates a new DeviceAdminReceiver component and adds it to your Android manifest.">
  
  
        id="className"
        name="Class Name"
        type="string"
        constraints="class|unique|nonempty"
        default="MyDeviceAdminReceiver"     
help="The name of the DeviceAdminReceiver component class to create"/>
    
        id="isExported"
        name="Exported"
        type="boolean"
        default="true"
        help="Whether or not the broadcast receiver can receive messages from sources outside its application" />
    
        id="isEnabled"
        name="Enabled"
        type="boolean"
        default="true"
        help="Whether or not the broadcast receiver can be instantiated by the system" /> 
    
            id="packageName"
            name="Package name"
            type="string"
            constraints="package"
            default="com.mycompany.myapp"/>
    
    
7, 修改recipe.xml.ftl,仅增加了个xml文件:
    
    
<?xml version="1.0"?>

    
             to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />
 
             to="${escapeXmlAttribute(resOut)}/xml/device_admin_receiver.xml" />
 
    
             to="${escapeXmlAttribute(srcOut)}/${className}.java" />
    
    
OK,仔细检查下代码,不然使用模板出错了很麻烦的,我的就需要重启android-studio。现在在项目里创建个DeviceAdminReceiver:
Android Studio自定义模板:简单自定义DeviceAdminReceiver模板_第5张图片 嗯,代码就没啥好贴的了,以后使用中再根据需要向模板里面添加功能 Android Studio自定义模板:简单自定义DeviceAdminReceiver模板_第6张图片

更多相关文章

  1. 重温android studio jni编译生成so文件
  2. Android 笔记:读取配置文件config.properties
  3. Android模仿表单上传文件
  4. ProgressBar:自定义旋转图片
  5. 文件androidAndroid使用PULL解析和生成XML文件
  6. android通过JNI用C/C++创建本地文件

随机推荐

  1. Java侵权诉讼Google获胜,Android厚积薄发
  2. Android下的Java之interface接口泛型 动
  3. Android上面搭建 Opencv的开发环境+摄像
  4. Android调用WCFRest
  5. 【Android】高德定位错误总结
  6. 【Android快捷开发笔记系列】——Data Bi
  7. Android中AsyncTask的处理后台耗时操作(如
  8. Android开发的硬件加速
  9. Android平台实现双向证书(https)验证简单
  10. 【android x86 5.1】system/core/目录下R