Android Studio自定义模板 做开发竟然可以如此轻松 后篇

###1.概述


最近有很多人反馈,有些哥们不喜欢看文字性的东西,还有一些哥们根本就不知道我在搞啥子,那么以后我就采用博客加视频的方式,我们可以选择看视频讲解:http://pan.baidu.com/s/1i5uh2uD   内涵段子项目资料及源码地址:https://ke.qq.com/course/193277#tuin=e533cfc   

大家不要被我的演示忽悠了,我手机上面的确有两个内涵段子的apk,接口也是内涵段子的接口,接口和素材待会在源码里面发给大家,但是所演示的是我自己写的。这里主要是讲,怎么去自定义我们的Android Studio 模板   如果你到目前还不知道我在哪个码头,请先看看这里,**利用自定义模板分分钟开发一个页面:**http://blog.csdn.net/z240336124/article/details/53053765

###2.实现


2.1. IDE中模板的文件结构      我们首先来参考一下IDE中自带的模板文件结构,我们Android Studio 的模板都放在 安装目录下\plugins\android\lib\templates\activities   

     上图都是我工程目录下的模板,至于效果请看前篇讲解,那么在Android Studio中最简单的activity模板就是:Empty Activity了,我们打开该模板文件,首先对文件结构有个直观的了解,请看图:      

那么接下来就对这些文件及里面的语法逐个介绍: 2.1.1. template.xml

<?xml version="1.0"?>
<templateformat="5"revision="5"name="Empty Activity"minApi="7"minBuildApi="14"description="Creates a new empty activity"><category value="Activity" /><formfactor value="Mobile" /><parameterid="activityClass"name="Activity Name"type="string"constraints="class|unique|nonempty"suggest="${layoutToActivity(layoutName)}"default="MainActivity"help="The name of the activity class to create" /><!-- .....此处省略几行无关紧要代码...... --><!-- 128x128 thumbnails relative to template.xml --><thumbs><!-- default thumbnail is required --><thumb>template_blank_activity.png</thumb></thumbs><globals file="globals.xml.ftl" /><execute file="recipe.xml.ftl" /></template>复制代码

这里其实可以不做过多解释,对着新建模板的样式看一下大概就可以理解了:

这个都是和 template.xml 对应的基本最多的是我标出来的parapmeter部分,下面来解释一下每个字段的含义

    id :唯一标识,最终会通过它获取字符串 是否选中等等name:界面上的左边的提示语type : 输入值类型  可以是string int boolean 等等constraints:填写值的约束  如文件名不能重复等等suggest:建议值,比如填写ActivityName的时候,会给出一个布局文件的建议值。default:默认值help:显示的帮助提升语
复制代码

2.1.2 globals.xml.ftl 这个其实没什么好看的 就一些id对应的初始值而已:

<globals><global id="hasNoActionBar" type="boolean" value="false" /><global id="parentActivityClass" value="" /><global id="simpleLayoutName" value="${layoutName}" /><global id="excludeMenu" type="boolean" value="true" /><global id="generateActivityTitle" type="boolean" value="false" /><#include "../common/common_globals.xml.ftl" />
</globals>
复制代码

**2.1.3 ** recipe.xml.ftl

<?xml version="1.0"?>
<recipe><#include "../common/recipe_manifest.xml.ftl" /><#if generateLayout><#include "../common/recipe_simple.xml.ftl" /><open file="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />
</#if><instantiate from="root/src/app_package/SimpleActivity.java.ftl"to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" /><open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
</recipe>
复制代码

这个需要重点介绍一下了,待会一新建会自动生成什么文件,或是生成什么代码都是靠它来指定:

  • copy :从root中copy文件到我们的目标目录,比如我们的模板Activity需要使用一些图标,那么可能就需要使用copy标签将这些图标拷贝到我们的项目对应文件夹。

  • merge : 合并的意思,比如将我们使用到的strings.xml合并到我们的项目的stirngs.xml中

  • instantiate : 和copy类似,但是可以看到上例试将ftl->java文件的,也就是说中间会通过一个步骤,会生成root下面对应的代码,也就是说你待会root下面的Activity写了什么就会生成什么

  • open:在代码生成后,打开指定的文件,比如我们新建一个Activity后,默认就会将该Activity打开。

**2.1.4 ** freemarker语法 我们可以看到这个 <#if generateLayout> ... 这个其实也是一种语法,我们写过程序基本就知道是什么意思,我们看看 root/src/app_package下面的SimpleActivity.java.ftl就大概知道了:

package ${packageName};// 包名 用 ${ } 引用import ${superClassFqcn};
import android.os.Bundle;public class ${activityClass} extends ${superClass} {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 这个我们大概还记得是一个可以勾选的参数 这里就用了if语法
<#if generateLayout>setContentView(R.layout.${layoutName});
</#if>}
}
复制代码

3. 小结 那么现在我们就知道IDE的模板结构以及格式了,那么我们就可以自定义了:

  • template.xml:他就是用来指定我们的参数,就是供用户选择和自定义
  • globals.xml.ftl : 它就是用来初始化一些参数,比如需不需要ActionBar 等等
  • recipe.xml.ftl : 它就是用来应用我们root文件夹下的资源,哪些需要copy哪些需要合并打开等等
  • root文件夹 存放对应源码的ftl文件,以及资源文件,待会生成的代码都会该文件夹下的一样

3. 开始撸代码

在这里估计我基本写不清楚了,这个不是***三言两语为成功干杯***的事,那么这个自己录个视频讲解:http://pan.baidu.com/s/1i5uh2uD***视频中不光讲了自定义开发模板还讲了一些其他的***。大家也可以自己开始尝试着去写了,源码和素材请在下面下载。

附源码地址:http://download.csdn.net/detail/z240336124/9674377 内涵段子项目资料及源码地址:https://ke.qq.com/course/193277#tuin=e533cfc

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/391846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked.

ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. 解决方案&#xff1a; 异步更新&#xff08;建议使用&#xff09;强制进行变更检测&#xff0c;但是会触发子组件的变更检测&#xff0c;再次导致父组件属性改变Parent.Component.…

leetcode 119. 杨辉三角 II

给定一个非负索引 k&#xff0c;其中 k ≤ 33&#xff0c;返回杨辉三角的第 k 行。 在杨辉三角中&#xff0c;每个数是它左上方和右上方的数的和。 示例: 输入: 3 输出: [1,3,3,1] 解题思路 因为杨辉三角的下层由上一层决定&#xff0c;所以只需要保存上一层的元素&#x…

掌握大数据数据分析师吗?_要掌握您的数据吗? 这就是为什么您应该关心元数据的原因...

掌握大数据数据分析师吗?Either you are a data scientist, a data engineer, or someone enthusiastic about data, understanding your data is one thing you don’t want to overlook. We usually regard data as numbers, texts, or images, but data is more than that.…

react 使用 mobx_如何使用React和MobX状态树构建基于状态的路由器

react 使用 mobxby Miles Till由Miles Till 如何使用React和MobX状态树构建基于状态的路由器 (How to build a state-based router using React and MobX State Tree) Introducing mobx-state-tree-routerMobx状态树路由器简介 If you want to skip ahead to the finished ex…

docker在Centos上的安装

Centos6安装docker 系统&#xff1a;centos6.5 内核&#xff1a;3.10.107-1(已升级)&#xff0c;docker对RHEL/Centos的最低内核支持是2.6.32-431&#xff0c;epel源的docker版本推荐内核为3.10版本。 内核升级可参考&#xff1a;https://www.jslink.org/linux/centos-kernel-u…

Lambda表达式的前世今生

Lambda 表达式 早在 C# 1.0 时&#xff0c;C#中就引入了委托&#xff08;delegate&#xff09;类型的概念。通过使用这个类型&#xff0c;我们可以将函数作为参数进行传递。在某种意义上&#xff0c;委托可理解为一种托管的强类型的函数指针。 通常情况下&#xff0c;使用委托来…

matplotlib柱状图、面积图、直方图、散点图、极坐标图、箱型图

一、柱状图 1.通过obj.plot() 柱状图用bar表示&#xff0c;可通过obj.plot(kindbar)或者obj.plot.bar()生成&#xff1b;在柱状图中添加参数stackedTrue&#xff0c;会形成堆叠图。 fig,axes plt.subplots(2,2,figsize(10,6)) s pd.Series(np.random.randint(0,10,15),index …

微信支付商业版 结算周期_了解商业周期

微信支付商业版 结算周期Economics is an inexact science, finance and investing even more so (some would call them art). But if there’s one thing in economics that you can consistently count on over the long run, it’s the tendency of things to mean revert …

leetcode 448. 找到所有数组中消失的数字

给定一个范围在 1 ≤ a[i] ≤ n ( n 数组大小 ) 的 整型数组&#xff0c;数组中的元素一些出现了两次&#xff0c;另一些只出现一次。 找到所有在 [1, n] 范围之间没有出现在数组中的数字。 您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回…

前端初学者开发学习视频_初学者学习前端开发的实用指南

前端初学者开发学习视频by Nikita Rudenko通过尼基塔鲁登科(Nikita Rudenko) 初学者学习前端开发的实用指南 (A practical guide to learning front end development for beginners) I started my coding journey in spring 2018, a bit less than one year ago. I earned som…

weblogic启动失败案例(root启动引起的权限问题)

weblogic的一个domain启动失败&#xff0c;在日志中有如下信息提示&#xff1a; **************************************************** To start WebLogic Server, use a username and ** password assigned to an admin-level user. For ** server administration, us…

HTTP请求示例

HTTP请求格式当浏览器向Web服务器发出请求时&#xff0c;它向服务器传递了一个数据块&#xff0c;也就是请求信息&#xff0c;HTTP请求信息由3部分组成&#xff1a;l 请求方法URI协议/版本l 请求头(Request Header)l 请求正文下面是一个HTTP请求的例子&#xff1a;GET/sa…

Bootstrap——可拖动模态框(Model)

还是上一个小项目&#xff0c;o(╥﹏╥)o&#xff0c;要实现点击一个div或者button或者一个东西然后可以弹出一个浮在最上面的弹框。网上找了找&#xff0c;发现Bootstrap的Model弹出框可以实现该功能&#xff0c;因此学习了一下&#xff0c;实现了基本弹框功能&#xff08;可拖…

mfcc中的fft操作_简化音频数据:FFT,STFT和MFCC

mfcc中的fft操作What we should know about sound. Sound is produced when there’s an object that vibrates and those vibrations determine the oscillation of air molecules which creates an alternation of air pressure and this high pressure alternated with low …

leetcode 765. 情侣牵手(并查集)

N 对情侣坐在连续排列的 2N 个座位上&#xff0c;想要牵到对方的手。 计算最少交换座位的次数&#xff0c;以便每对情侣可以并肩坐在一起。 一次交换可选择任意两人&#xff0c;让他们站起来交换座位。 人和座位用 0 到 2N-1 的整数表示&#xff0c;情侣们按顺序编号&#xff…

ariel字体_播客第58集:软件开发人员和freeCodeCamp超级巨星Ariel Leslie

ariel字体On this weeks episode of the freeCodeCamp.org podcast, Abbey interviews Ariel Leslie, a software developer and avid contributor to the freeCodeCamp community.在本周的freeCodeCamp.org播客节目中&#xff0c;Abbey采访了Ariel Leslie&#xff0c;他是free…

PHP绘制3D图形

PEAR提供了Image_3D Package来创建3D图像。图像或光线在3D空间中按照X、Y 、Z 坐标定位。生成的图像将呈现在2D空间中&#xff0c;可以存储为 PNG、SVG 格式&#xff0c;或输出到Shell。通过Image_3D可以很方便生成一些简单的3D对象&#xff0c;例如立方体、锥体、球体、文本和…

清除日志的sql

SET NOCOUNT ONDECLARE LogicalFileName sysname,MaxMinutes INT,NewSize INTUSE cms -- 要操作的数据库名SELECT LogicalFileName cms_log, -- 日志文件名MaxMinutes 10, -- Limit on time allowed to wrap log.NewSize 100 -- 你想设定的日志文件的大小(M)-- Setup / init…

r语言怎么以第二列绘制线图_用卫星图像绘制世界海岸线图-第二部分

r语言怎么以第二列绘制线图Part I of this blog series is here.本博客系列的第一部分 在这里 。 At the UKHO we are interested in the oceans, the seabed and the coastline — not to mention everything in and on them! In our previous blog, we (the UKHO Data Scien…

javascript创建类_如何在10分钟内使用JavaScript创建费用管理器

javascript创建类by Per Harald Borgen通过Per Harald Borgen 如何在10分钟内使用JavaScript创建费用管理器 (How to create an expense organizer with JavaScript in 10 minutes) 让我们使用ES6和Dropbox API来防止收据变得混乱。 (Let’s use ES6 and the Dropbox API to k…