写点什么

[译] 使用自定义文件模板加快你的应用开发速度

用户头像
Android架构
关注
发布于: 21 小时前
  • 将下面的模板代码粘贴到名称字段下方的区域中。我会一步一步解释代码中发生了什么:


#if ({PACKAGE_NAME} && {PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end


import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import java.util.List;


#parse("File Header.java")public class {VIEWHOLDER_CLASS}> {private final Context context;private List<${ITEM_CLASS}> items;


public {ITEM_CLASS}> items, Context context) {this.items = items;this.context = context;}


@Overridepublic {VIEWHOLDER_CLASS} onCreateViewHolder(ViewGroup parent,int viewType) {View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.{LAYOUT_RES_ID}, parent, false);return new ${VIEWHOLDER_CLASS}(v);}


@Overridepublic void onBindViewHolder({VIEWHOLDER_CLASS} holder, int position) {{ITEM_CLASS} item = items.get(position);holder.set(item);}


@Overridepublic int getItemCount() {if (items == null){return 0;}return items.size();}


public class ${VIEWHOLDER_CLASS} extends Rec


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


yclerView.ViewHolder {


public ${VIEWHOLDER_CLASS}(View itemView) {super(itemView);}


public void set(${ITEM_CLASS} item) {//UI setting code}}}


  • 如果你快速阅读 android studio 中代码输入字段下面的 Description 面板,上面的大部分代码都很容易理解。

  • ${<VARIABLE_NAME>} 用于创建在整个模板中使用的变量,并且当你使用模板创建代码时,系统会提示你为它们输入值。这还有一些预定义的变量,比如 ${PACKAGE_NAME}${DATE}等。

  • #if 指令用来检查包名是否为空,如果不为空,则将名称添加到作为 ${PACKAGE_NAME} 变量传递的包语句中。

  • #parse 指令用于插入另一个名为 File Header.java 模板的内容,你可以在同一窗口的 includes 选项卡下找到该模板。看起来像这样:



  • 其余代码使用这些变量和静态文本,代码和注释来创建文件。

  • 现在右键单击任何目录,然后单击 New,你将在那里找到你的模板。单击它将打开一个提示框,输入我们之前定义的占位符的值。




  • 以下是我们生成的模板:


package io.github.rajdeep1008.templatedemo;


import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;


import java.util.List;


public class SchoolData extends RecyclerView.Adapter<SchoolData> {private final Context context;private List<SchoolItem> items;


public SchoolData(List<SchoolItem> items, Context context) {this.items = items;this.context = context;}


@Overridepublic SchoolData onCreateViewHolder(ViewGroup parent,int viewType) {View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.R.layout.item_school, parent, false);return new SchoolData(v);}


@Overridepublic void onBindViewHolder(SchoolData holder, int position) {SchoolItem item = items.get(position);holder.set(item);}


@Overridepublic int getItemCount() {if (items == null) {return 0;}return items.size();}


public class SchoolData extends RecyclerView.ViewHolder {


public SchoolData(View itemView) {super(itemView);}


public void set(SchoolItem item) {//UI setting code}}}


使用我们的 Android Studio 模板生成文件。

章节 2:

  • 这个章节与我们为 mvp 源文件创建模板的最终目的没什么关系,但知道 Android Studio 为我们提供的每个选项是有好处的。

  • 实时模板是你在代码中快速获取代码段的快捷方式。你还可以添加参数来快速标记它们。



在 Android Studio 中播放实时模板。


  • 对于 mac 用户,导航到 Android Studio -> Preferences -> Editor -> Live Templates,在这里你将看到一个包含已有实时模板的列表框,比如 fbc 用于 findViewById 映射,foreach 用于创建 loop 等。

  • 现在点击 Android -> + ->LiveTemplate,你可以选择添加缩写来使用模板,说明模板的功能以及模板的模板文本。

  • 现在点击 Define 并选择弹框中的 XML 选项来选择模板可用的文件类型。



Android Studio 中实时模版创建向导


  • 单击确定保存并开始使用它。打开 XML 布局文件并开始输入 rv 并按 Tab 以适用新创建的模板。



我们新创建的实时模板

章节 3:

Pheww!我们已经介绍了很多东西,现在是时候开始创建我们的 mvp 模板了。我们需要创建一个 Activity、DaggerModule、Contract 和 Presenter。前缀将作为用户输入,剩下的将采用本文开头所述的格式。


  • 导航到你的 Windows/Linux/Mac 文件系统中的 Android Studio 目录,然后转到 plugins -> android -> lib -> templates -> other,用你希望在菜单中看到的名称创建一个空目录,我将其命名为 MVP Template。

  • 在 mac 中,目录的位置应该为 /Applications/Android/Studio.app/Contents/plugins/android/lib/templates/other/,对于 windows 或 linux,你可以在 {ANDROID_STUDIO_LOCATION}/plugins/android/lib/templates/other/ 中找到它。

  • 确保检查模板中的 activities 目录,看看如何模板创建 EmptyActivity、BasicActivity 以及其他文件,这将有助于编写自己的模板。

  • 现在,在新创建的 MVP Template 目录中,创建 template.xml、recipe.xml.ftlglobals.xml.ftl。并且创建一个名为 root 的目录,它将保存我们创建的实际模板文件。我将逐一解释每个文件的作用:


  1. template.xml — 它用来处理屏幕配置的 UI 部分。 它定义了用户在使用模板创建文件时看到的用户输入字段、复选框和下拉列表等。

  2. recipe.xml.ftl — 这是使用的文件,你的根目录中的模板将转换为 Android Studio 中真实的 java 文件。它包含有关要创建哪些文件以及从哪些模板创建等信息。

  3. globals.xml.ftl?— 这包含所有全局变量。在这里为 src 和 res 定义目录路径是一个很好的做法。


  • 在 template.xml 文件中,粘贴以下代码:


<template format="4"revision="1"name="MVP Template Activity"description="Creates a new MVP classes - Presenter, View, Contract and Dagger Module.">


<category value="Other"/>


<parameter id="className"name="Functionality Name"type="string"constraints="class|unique|nonempty"default="MvpDemo"help="The name of the functionality that requires MVP views"/>


<globals file="globals.xml.ftl" /><execute file="recipe.xml.ftl" />


</template>


template.xml 描述了应该从用户那里获得的参数:


  1. id 是该元素的唯一 id。

  2. name 只是向用户显示的提示(就像在 EditText 中的提示一样)。

  3. type 定义用户应该显示文本输入还是下拉控件中的枚举值,或在布尔值的情况下显示复选框。

  4. default 用户输入为空时的默认值。

  5. globalsexecute 属性链接我们的全局变量和配置文件。


  • 在 recipe.xml.ftl 文件中,粘贴以下代码:


<?xml version="1.0"?><recipe>


<instantiate from="src/app_package/Contract.java.ftl"to="{className}Contract.java" /><instantiate from="src/app_package/Activity.java.ftl"to="{className}Activity.java" /><instantiate from="src/app_package/Presenter.java.ftl"to="{className}Presenter.java" /><instantiate from="src/app_package/ActivityModule.java.ftl"to="{className}ActivityModule.java" />


<open file="{className}Presenter.java"/><open file="{className}Contract.java"/><open file="{className}Activity.java"/><open file="{className}ActivityModule.java"/></recipe>


recipe.xml.ftl 定义从哪个模板创建哪些文件以及创建后打开哪些文件。它还可以将代码从我们的模板复制到 manifest.xml 或 string.xml 等文件中。请务必查看用于创建 activities 的默认模板示例。


className 变量是我们从用户那里获取的输入的 id,其代码用 template.xml 编写,srcOut 在 globals.xml.ftl 中定义。文件的其他部分具有很好的自我解释能力。


  • 在 globals.xml.ftl 中:


<?xml version="1.0"?><globals><global id="resOut" value="{srcDir}/${slashedPackageName(packageName)}" /></globals>


  • 现在,在根目录中,创建 src/app_package/ 目录并将以下四个文件复制到该目录中:


package ${packageName};


public class {className}Contract.Presenter> implements ${className}Contract.View {


@Overrideprotected void onCreate(final Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_demo);}


}


package ${packageName};


@Modulepublic abstract class {className}ActivityModule {@Binds@PerActivityabstract {className}Contract.Presenter providesPresenter(${className}Presenter presenter);


@Binds@PerActivityabstract {className}Activity activity);}


package ${packageName};


public interface ${className}Contract{


interface View extends DemoBaseContract.ActivityView {


}


interface Presenter extends DemoBaseContract.Presenter {


}}


package ${packageName};


public class {className}Contract.View> implements ${className}Contract.Presenter {


@Injectpublic {className}Contract.View view){super(view);}


@Overridepublic void subscribe() {


}


@Overridepublic void unSubscribe() {


}}


这些文件包含将完全转换为 java 或 xml 代码的模板,参数将被实际值替换。


我们终于完成了所有步骤。只需要重启 Android Studio 即可启用此模板,并显示在菜单中。



我们新创建的 MVP 模板



如果使用得当,Android Studio 模板是加快应用开发速度的强大功能。这些模板可以分布在整个 Android 团队中,以便简化样板代码的创建。


以上便是本文的所有内容。如果你喜欢这篇文章并发现它有用,请不要忘记点赞并与其他 Android 开发者分享它。Happy coding ??。


顺便说一句我开通了每周简报 thedevweekly我将通过网站、移动设备和系统上精心挑选文章,并在有关新技术学习及一些大科技公司内部学习文章之间取得平衡。


因此,无论你是初学者还是专家,如果你正在寻找精心策划的科技文章的每周摘要,请在 这里 注册 .

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
[译] 使用自定义文件模板加快你的应用开发速度