Android Studio自定义模板

  • 找到Android Studio中的模板放置地方

    android-studio->plugins->android->lib->templates->activities
    
  • 创建自己的模板

这里写图片描述

例如这里我创建了自己的HEmptyActivity,HListActivity,WelcomeActivity三个模板
  • 目录的含义

这里写图片描述

1、template.xml

<?xml version="1.0"?>
<template
    format="5"
    revision="6"
    name="Welcome Activity"
    description="Creates a new welcome activity"
    requireAppTheme="true"
    minApi="8"
    minBuildApi="14">

    <dependency name="android-support-v4" revision="8" />

    <category value="Activity" />
    <formfactor value="Mobile" />

    <parameter
        id="activityClass"
        name="Activity Name"
        type="string"
        constraints="class|unique|nonempty"
        default="WelcomeActivity"
        help="The name of the activity class to create" />

    <parameter
        id="layoutName"
        name="Layout Name"
        type="string"
        constraints="layout|unique|nonempty"
        suggest="${activityToLayout(activityClass)}"
        default="activity_welcome"
        help="The name of the layout to create for the activity" />

    <parameter
        id="parentActivityClass"
        name="Hierarchical Parent"
        type="string"
        constraints="activity|exists|empty"
        default=""
        help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />

    <parameter
        id="packageName"
        name="Package name"
        type="string"
        constraints="package"
        default="com.mycompany.myapp" />

    <thumbs>
        <thumb>template_welcome_activity.png</thumb>
    </thumbs>

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

</template>

这里写图片描述

这里的配置和名称都是由template中进行配置的
thumb表示as显示的图片
注意:<parameter
        id="parentActivityClass"
        name="Hierarchical Parent"
        type="string"
        constraints="activity|exists|empty"
        default=""
        help="The hierarchical parent activity, used to provide a default implementation for the 'Up' button" />
        不能删除,否则as创建时会出错,其他的配置这里已经删除,
        如果需要,可以去LoginActivity中copy
    id :唯一标识,最终会通过它获取字符串 是否选中等等
    name:界面上的左边的提示语
    type : 输入值类型  可以是string int boolean 等等
    constraints:填写值的约束  如文件名不能重复等等
    suggest:建议值,比如填写ActivityName的时候,会给出一个布局文件的建议值。
    default:默认值
    help:显示的帮助提升语

2、globals.xml.ftl

一般不用动

3、recipe.xml.ftl

<?xml version="1.0"?>
<recipe>
   <#if appCompat && !(hasDependency('com.android.support:appcompat-v7'))>
       <dependency mavenUrl="com.android.support:appcompat-v7:${buildApi}.+" />
    </#if>


    <merge from="root/AndroidManifest.xml.ftl"
             to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />

    <merge from="root/res/values/styles.xml.ftl"
              to="${escapeXmlAttribute(resOut)}/values/styles.xml" />
    <instantiate from="root/res/layout/activity_welcome.xml.ftl"
                   to="${escapeXmlAttribute(resOut)}/layout/${layoutName}.xml" />

    <instantiate from="root/src/app_package/WelcomeActivity.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打开。

a、合并AndroidManifest

<merge from="root/AndroidManifest.xml.ftl"
             to="${escapeXmlAttribute(manifestOut)}/AndroidManifest.xml" />

b、合并styles

 <merge from="root/res/values/styles.xml.ftl"
              to="${escapeXmlAttribute(resOut)}/values/styles.xml" />

c、合并dimens

<merge from="root/res/values/dimens.xml"
             to="${escapeXmlAttribute(resOut)}/values/dimens.xml" />

d、合并strings

<merge from="root/res/values/strings.xml.ftl"
             to="${escapeXmlAttribute(resOut)}/values/strings.xml" />
同时这里引入的activity和xml名称都需要和root中的进行对应,
当然合并的内容也需要对应
  • root目录

这里写图片描述

1、在res中

这里写图片描述

a、dimens和strings的写法可以参考LoginActivity

b.styles的写法(styles.xml.ftl)

<resources>

   <style name="FullscreenTheme" parent="Theme.AppCompat.Light.NoActionBar">
         <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

</resources>
  • src中是创建的activity(WelcomeActivity.java.ftl)
package ${packageName};

import ${superClassFqcn};
import android.os.Bundle;
import android.os.Handler;
import android.content.Intent;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import java.lang.ref.WeakReference;
public class ${activityClass} extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.${layoutName});
        //for a moment start new activity
        MyHandler myHandler = new MyHandler(this);
        myHandler.sendEmptyMessageDelayed(0, 3000);
    }
    private static class MyHandler extends Handler {

        private WeakReference<WelcomeActivity> mActivity;

        public MyHandler(WelcomeActivity mActivity) {
            this.mActivity = new WeakReference<WelcomeActivity>(mActivity);
        }

        @Override 
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            WelcomeActivity activity = mActivity.get();
            if (activity == null || activity.isFinishing()) {
                return;
            }
            switch (msg.what) {
                case 0: 
                    Intent intent= new Intent(activity,MainActivity.class);
                    activity.startActivity(intent);
                    activity.finish();
                break;
            }
        }
    }

}
package ${packageName};// 包名 用 ${ } 引用

import ${superClassFqcn};
import android.os.Bundle;

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

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       // 这个我们大概还记得是一个可以勾选的参数 这里就用了if语法
<#if generateLayout>
        setContentView(R.layout.${layoutName});
</#if>
    }
}
  • AndroidManifest.xml.ftl
<manifest xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- To auto-complete the email text field in the login form with the user's emails -->

    <application>
        <activity android:name=".${activityClass}"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden|screenSize"
            android:theme="@style/FullscreenTheme"
            <#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}"</#if>>
            <#if parentActivityClass != "">
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value="${parentActivityClass}" />
            </#if> 
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>
对应不需要的可以自行删除

这时重启as就可以使用我们自己的模板了!

这里所述的方法是在android3.0以下版本适用,这里测试版本为2.3.3
如果需要在androidstudio3.0以上,需要增加对kotlin的支持,(具体可以copy一份写好的模板例如:LoginActivity,对java部分进行上述改动,kotlin如果使用的是kotlin开发,再自行改动!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值