Android Studio自定义模板 写页面竟然可以如此轻松(1)

<#include “…/common/common_globals.xml.ftl” />

通过名称可以猜到它是用于定义一些全局的变量,可以看到其内部有<global>标签,分别定义id,type,默认值。

同理,我们可以通过id的值访问到该值,例如:

${hasNoActionBar}的值为false。

2.3 recipe.xml.ftl

<copy from=“root/res/drawable-hdpi”

to=“${escapeXmlAttribute(resOut)}/drawable-hdpi” />

<merge from=“root/${resIn}/values/strings.xml.ftl”

to=“${escapeXmlAttribute(resOut)}/values/strings.xml” />

<instantiate from=“root/src/app_package/SimpleActivity.java.ftl”

to=“ e s c a p e X m l A t t r i b u t e ( s r c O u t ) / {escapeXmlAttribute(srcOut)}/ escapeXmlAttribute(srcOut)/{activityClass}.java” />

为了介绍,我将该xml中比较重要的几个标签都列出来了:

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

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

  • instantiate : 和copy类似,但是可以看到上例试将ftl->java文件的,也就是说中间会通过一个步骤,将ftl中的变量都换成对应的值,那么完整的流程是ftl->freemarker process -> java

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

在介绍instantiate时,涉及到了freemarker,不可避免的需要对它进行简单的介绍。

目前我们已经基本了解了一个模板其内部的文件结构了,以及每个文件大致包含的东西,我们简单做个总结:

  • template 中parameter标签,主要用于提供参数

  • global.xml.ftl 主要用于提供参数

  • recipe.xml.ftl 主要用于生成我们实际需要的代码,资源文件等;例如,利用参数+MainActivity.java.ftl -> MainActivity.java;其实就是利用参数将ftl中的变量进行替换。

那么整体的关系类似下图:

图片来源:http://www.slideshare.net/murphonic/custom-android-code-templates-15537501

3、简单的freemarker语法


上面我们已经基本了解模板生成的大致的流程以及涉及到的文件,大致了解了我们生成的源码或者xml文件,需要经过:

  • ftl->freemarker process->java/xml

这样的流程,那么我们必须对freemarker有个简单的了解。

  • 非常简单的例子

其实非常简单:

比如我们有个变量user=zhy;

有个ftl文件内容:helloL${user}

最后经过freemarker的输出结果即为 hello:zhy

  • if语法

<#if generateLayout>

//生成layout文件

</#if>

看一眼就知道大概的意思了~有一定的编程经验,即使不知道这个叫freemarker,对于这些简单的语法还是能看懂的。

我们最后以Empty Activity模板的中的SimpleActivity为例:

root/src/app_package/SimpleActivity.java.ftl

package ${packageName};

import ${superClassFqcn};

import android.os.Bundle;

public class ${activityClass} extends ${superClass} {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

<#if generateLayout>

setContentView(R.layout.${layoutName});

</#if>

}

}

可以看到其内部包含很多变量,这些变量的值一般来源于用户输入和global.xml.ftl中预定义的值,经过recipe.xml.ftl中instantiate标签的处理,将变量换成实际的值,即可在我们的项目的指定位置,得到我们期望的Activity。

流程大致可用下图说明:

图片来源:http://www.slideshare.net/murphonic/custom-android-code-templates-15537501

看到这,最起码理解了,当我们选择创建不同的Activity类型,最终得到的不同的效果其中的原理原来在这。

4、具体的模板实例


了解了基本的理论之后,下面我们可以通过一个实例来将上面的知识点整合。

我们编写一个Activity模板叫做:ViewPagerWithTabActivity,用于创建一个携带TabLayout的ViewPager,效果如下:

当我们点击New->Activity->ViewPagerWithTabActivity 就可能完成上面的Activity的创建,而避免了编写布局文件,引入design库,以及一些简单的编码。

是不是感觉还是不错的,大家可以针对自己的需求,按照规范的格式随意定制模板。

建议大家copy一个现有的模板,再其基础上修改即可,比如本例是在Empty Activity基础之上修改的。

下面我们看上例的具体的实现。

4.1 template.xml的编写

通过上面的学习我们知道template.xml中可以定义我们创建面板的控件布局等,本例我们创建Activity的界面如下:

对应的template.xml如下:

<?xml version="1.0"?>

template_vp_with_tab_activity.png

经过前面的学习应该很好理解,每个parameter对应界面上的一个控件,控件的这个id最终可以得到用户输入值,后面会用于渲染ftl文件。

4.2 用到的类

本例中最终需要生成Fragment和Activity,也就是说对应会有两个ftl文件分别用于最终生成这两个类。

  • root/src/app_package/MainActivity.java.ftl

package ${packageName};

import android.os.Bundle;

import android.support.design.widget.TabLayout;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentPagerAdapter;

import android.support.v4.view.ViewPager;

import android.support.v7.app.AppCompatActivity;

import ${packageName}.fragment.SimpleFragment;

public class ${activityClass} extends AppCompatActivity

{

private TabLayout mTabLayout;

private ViewPager mViewPager;

private int mTabCount = ${tabCount};

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.${activityLayoutName});

mTabLayout = (TabLayout) findViewById(R.id.id_tablayout);

mViewPager = (ViewPager) findViewById(R.id.id_viewpager);

mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager())

{

@Override

public Fragment getItem(int position)

{

return new SimpleFragment();

}

@Override

public int getCount()

{

return mTabCount;

}

@Override

public CharSequence getPageTitle(int position)

{

return “Tab:” + position;

}

});

mTabLayout.setupWithViewPager(mViewPager);

}

}

注意不是.java文件而是.ftl文件,可以看到上面的代码基础上和Java代码没什么区别,实际上就是Java代码,把可变的部分都换成了${变量名}的方式而已。

例如:类名是用户填写的,我们就使用${activityClass}替代,其他同理。

  • root/src/app_package/SimpleFragment.java.ftl

package ${packageName}.fragment;

import android.os.Bundle;

import android.support.annotation.Nullable;

import android.support.v4.app.Fragment;

import android.view.Gravity;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.TextView;

/**

  • Created by zhy on 16/6/6.

*/

public class SimpleFragment extends Fragment

{

@Nullable

@Override

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)

{

TextView tv = new TextView(getActivity());

tv.setGravity(Gravity.CENTER);

tv.setTextSize(40);

tv.setText(“just test”);

return tv ;

}

}

这个类更简单,除了package是动态的,其他都写好了,主要用于作为ViewPager的Fragment Item.

4.3 用到的布局文件

  • root/res/layout/activity_main.xml.ftl
<?xml version="1.0" encoding="utf-8"?>

<LinearLayout

xmlns:android=“http://schemas.android.com/apk/res/android”

xmlns:tools=“http://schemas.android.com/tools”

android:layout_width=“match_parent”

android:layout_height=“match_parent”

android:orientation=“vertical”

tools:context=" p a c k a g e N a m e . {packageName}. packageName.{activityClass}">

<android.support.design.widget.TabLayout

android:id=“@+id/id_tablayout”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”>

</android.support.design.widget.TabLayout>

<android.support.v4.view.ViewPager

android:id=“@+id/id_viewpager”

android:layout_width=“match_parent”

android:layout_height=“0dp”

android:layout_weight=“1”

/>

发现和我们真正编写的Activity并无多大区别。

看完用到的类和布局文件的ftl,大家心里应该有个底了,这模板几乎就和我们平时写的Java类一样,只是根据用户在新建Actiivty界面所输入的参数进行替换一些变量或者做一些简单的操作而已。

4.4 recipe.xml.ftl的编写

除了template.xml还有globals.xml.ftl和recipe.xml.ftl,globals.xml.ftl中基本上没有修改任何内容就不介绍了。

recipe.xml.ftl中定义的东西比较关键,例如将ftl->java,copy、合并资源文件等。

内容较长,我们拆开描述。

  • 引入依赖
<?xml version="1.0"?>

<#include “…/common/recipe_manifest.xml.ftl” />

<#if !appCompat && !(hasDependency(‘com.android.support:support-v4’))>

</#if>

<#if appCompat && !(hasDependency(‘com.android.support:appcompat-v7’))>

</#if>

<#if (buildApi gte 22) && appCompat && !(hasDependency(‘com.android.support:design’))>

</#if>

//省略其他

本例依赖v4、v7、和design库,我们需要在这里定义引入;

你可能会问,这个引入的代码看起来挺复杂,你怎么知道这样写呢?

其实我也不知道怎么写,但是我可以打开IDE自带模板参考参考,copy过来就好了。

  • 剩下的内容

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

总结

【Android 详细知识点思维脑图(技能树)】

image

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

98)]

总结

【Android 详细知识点思维脑图(技能树)】

[外链图片转存中…(img-ma5YPBY5-1713727606599)]

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

[外链图片转存中…(img-1hxFTy0W-1713727606600)]

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值