二话不说,上图:
看出端倪没有?是不是多了几个你不认识的界面?
一、Activity模板
今天做的就是像这种,可以快速创建自己想要的Activity模板。开发过程中,创建Activity时,我通常都会选择一个Empty Activity,然后再自己写界面,相信大部分菜鸟(没错,说的就是我)都是这么做的吧。但是,如果以后每次自己撸代码的时候,又想要创建Activity,这个Activity又是一个自己以前做过的差不多的,为了省时省力,是再回去找自己以前写过代码进行复制,还是自己重头再写一次呢?相信这两种方式都有些麻烦吧。那么,是不是可以把我们觉得会经常创建Activity做成一个模板,以后想要的时候,直接new-->activity-->自己的模板Activity就行了呢,比如:
你可以打开自己的android studio查看一下,是否有上面这些红色箭头指向的Activity,不出意外,你是找不到的。这个就是要说的Activity模板。
二、模板Activity的创建
首先,是把自己想做成模板的Activity 先创建出来。
做一个带有RecyclerView的Activity,只是作为例子展示,所以不做很复杂的界面。
三、创建自己的模板文件
打开android studio的安装目录,按顺序打开plugins --> android --> lib --> templates --> activities ,这里存放的就是所有activity模板。
要创建自己的模板文件,先复制一份已有的模板文件夹,这里复制FullscreenActivity文件夹,里面的结构为:
这里就不对上面这些文件进行解释了,因为文件代表什么意思,其实我也不知道,但是我们只要知道里面有什么,作用是什么就行了。下面我会把编辑好的各个文件的内容贴出来,里面都有注释的。
自己做的模板文件目录:
root文件夹
res/layout文件夹
src/app_package文件夹
globals.xml.ftl文件内容:
<?xml version="1.0"?>
<globals>
<global id="hasNoActionBar" type="boolean" value="false" />
<global id="parentActivityClass" value="" />
<global id="excludeMenu" type="boolean" value="true" />
<global id="generateActivityTitle" type="boolean" value="false" />
<#include "../common/common_globals.xml.ftl" />
</globals>
这里的globals文件里面从FullscreenActivity复制过来的时候只有最后一个,但是经过测试,只有最后一个是不能用的,还得加上其他的,所以上面这些内容就是全部的,如果有人知道为什么只有最后一个不行的原因,希望能告诉一下哈。
recipe.xml.ftl文件内容:
<?xml version="1.0"?>
<recipe>
<#include "../common/recipe_manifest.xml.ftl" />
<#if !appCompat && !(hasDependency('com.android.support:support-v4'))>
<dependency mavenUrl="com.android.support:support-v4:${buildApi}.+"/>
</#if>
<#if appCompat && !(hasDependency('com.android.support:appcompat-v7'))>
<dependency mavenUrl="com.android.support:appcompat-v7:${buildApi}.+" />
</#if>
<!-- 判断是否在gradle已经依赖了这个库,没有则进行依赖 -->
<#if !(hasDependency('com.android.support:recyclerview-v7'))>
<dependency mavenUrl="com.android.support:recyclerview-v7:${buildApi}.+" />
</#if>
<#if (buildApi gte 22) && appCompat && !(hasDependency('com.android.support:design'))>
<dependency mavenUrl="com.android.support:design:${buildApi}.+" />
</#if>
<!-- 创建RecyclerViewActivity -->
<instantiate from="root/src/app_package/RecyclerViewActivity.java.ftl"
to="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
<!-- 创建activity_recycler_view.xml 布局文件 这里的${activityLayoutName}其实就是template.xml中默认的layout名字-->
<instantiate from="root/res/layout/activity_recycler_view.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/${activityLayoutName}.xml" />
<!--创建item_text.xml布局-->
<instantiate from="root/res/layout/item_text.xml.ftl"
to="${escapeXmlAttribute(resOut)}/layout/item_text.xml" />
<!--打开文件,就是创建完是否打开-->
<open file="${escapeXmlAttribute(resOut)}/layout/${activityLayoutName}.xml"/>
<open file="${escapeXmlAttribute(srcOut)}/${activityClass}.java" />
<!--创建一些资源文件,如果有创建其他像drawable下的文件,可以在这里创建,创建语法如下,我们这里没有其他文件,所以注释掉了,但是避免你做模板的时候需要创建这些文件,所以贴出来,方便你查看创建的方法-->
<!--
<merge from="root/res/drawable/ic_comment.xml"
to="${escapeXmlAttribute(resOut)}/drawable/ic_comment.xml" />
-->
</recipe>
template.xml文件内容:
<?xml version="1.0"?>
<template
format="5"
revision="7"
name="RecyclerViewActivity"
minApi="7"
minBuildApi="14"
description="创建一个带有RecyclerView的页面">
<!--上面的name="RecyclerViewActivity" 一定要写一个自己定好的名字-->
<category value="Activity" />
<formfactor value="Mobile" />
<!--创建页面的Activity的默认名字-->
<parameter
id="activityClass"
name="Activity Name"
type="string"
constraints="class|unique|nonempty"
default="RecyclerViewActivity"
help="Activity的名字" />
<!--创建页面的Layout的默认名字-->
<parameter
id="activityLayoutName"
name="Layout Name"
type="string"
constraints="layout|unique|nonempty"
default="activity_recycler_view"
help="创建的Activity对应的layout的名字" />
<parameter
id="isLauncher"
name="Launcher Activity"
type="boolean"
default="false"
help="如果选中,则该Activity会创建为APP的主入口" />
<parameter
id="packageName"
name="Package name"
type="string"
constraints="package"
default="com.mycompany.myapp" />
<!-- 128x128 thumbnails relative to template.xml -->
<thumbs>
<!-- default thumbnail is required -->
<!--创建时显示的界面图片-->
<thumb>my_template.png</thumb>
</thumbs>
<globals file="globals.xml.ftl" />
<execute file="recipe.xml.ftl" />
</template>
my_template.png 是这个activity的显示效果图。这种图片最终显示效果可能不好看,因为其他模板都是用512 x 512 的,我没有修改图片大小。你做的时候可以自己修改大小,那样会比较好看。
activity_recycler_view.xml.ftl文件内容
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/id_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
item_text.xml.ftl文件内容
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/id_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:background="#ccc"
android:padding="5dp">
</TextView>
RecyclerViewActivity.java.ftl文件内容:
package ${packageName};//这里代表你创建Activity的项目包名,一定记得要换成这个,不然创建后就不是你原本的包名了。
import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class RecyclerViewActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<String> data =new ArrayList<>();
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
initData();
mRecyclerView = (RecyclerView) findViewById(R.id.id_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
mAdapter = new MyAdapter(this);
mRecyclerView.setAdapter(mAdapter);
}
private void initData() {
data.add("adadadaadadad");
data.add("addjjjad");
data.add("adadadjf");
data.add("ajtyujhd");
data.add("ytsdgsd");
data.add("qvsbdh");
data.add("fgjfmf");
data.add("gyuluy");
data.add(".kj.jk.j.jl.j.j.y");
data.add("ukyktkt");
data.add("tkjryjgj");
data.add("rykrykry");
data.add("yrjkry");
data.add("ryjrjr");
}
class MyAdapter extends RecyclerView.Adapter<MyViewHolder>{
private Context mContext;
public MyAdapter(Context context) {
mContext = context;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).
inflate(R.layout.item_text, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.mTextView.setText(data.get(position));
}
@Override
public int getItemCount() {
return data.size();
}
}
class MyViewHolder extends RecyclerView.ViewHolder{
private TextView mTextView;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView.findViewById(R.id.id_text);
}
}
}
上面就是做这个模板文件的全部内容部分。
最后,完成后的效果展示图:
点击Finish就可以完成模板Activity的创建了。
这个只是一个很简单的模板文件的创建过程,你也可以根据这样的方式,创建一个属于你自己的模板。
注:将模板文件放在activities后,需要重启android studio才有效。写这些文件的时候,千万记得不要写错类名,布局名,后缀等。不然查找起来会非常麻烦,我在查找这种错误时也是花了很多时间的,所以,千万注意啊。