相信大家都有用过AndroidStudio的插件
比如ButterKnife可以自动生成插件
现在就教大家如何自己动手来写一个插件;
首先需要安装IntelliJ IDEA,这个百度一大把,就不介绍了
然后新建一个Plugin项目
创建好后的页面
在src文件夹下新建一个Action类
填写项目的一些信息
1:
ActionID:Action的唯一ID,一般格式为:pluginName.ID;
ClassName:类名;
Name:插件最终显示在AndroidStudio的名字;
Description:插件描述信息;
2:
3:
Keyboard Shortcuts:插件的快捷键
4:
Anchor:插件在code菜单下的位置
点击ok,就创建了一个Action类了;
public class CreateDialogAction extends BaseGenerateAction {
public CreateDialogAction() {
super(null);
}
public CreateDialogAction(CodeInsightActionHandler handler) {
super(handler);
}
@Override
public void actionPerformed(AnActionEvent e) {
}
}
注意把继承的AnAction改成BaseGenerateAction,下文需要用到BaseGenerateAction类中的相关方法。
代码实现
主要实现在类中自动生成代码,首先获取相关的操作类,已在代码中加入注释说明。
public CreateDialogAction() {
super(null);
}
public CreateDialogAction(CodeInsightActionHandler handler) {
super(handler);
}
@Override
public void actionPerformed(AnActionEvent e) {
// 获取编辑器中的文件
Project project = e.getData(PlatformDataKeys.PROJECT);
Editor editor = e.getData(PlatformDataKeys.EDITOR);
PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, project);
// 获取当前类
PsiClass targetClass = getTargetClass(editor, file);
// 获取元素操作的工厂类
PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
// 生成代码
new LayoutCreator(project, targetClass, factory, file).execute();
}
}
生成代码,需要继承WriteCommandAction.Simple类,在run方法中写生成代码的逻辑,将生成dialog的代码存入StringBuilder,然后调用targetClass类中的add方法生成代码,最后再导入需要的类。
private Project project;
private PsiFile file;
private PsiClass targetClass;
private PsiElementFactory factory;
public LayoutCreator(Project project, PsiClass targetClass, PsiElementFactory factory, PsiFile... files) {
super(project, files);
this.project = project;
this.file = files[0];
this.targetClass = targetClass;
this.factory = factory;
}
@Override
protected void run() throws Throwable {
// 将弹出dialog的方法写在StringBuilder里
StringBuilder dialog = new StringBuilder();
dialog.append("public void showDialog(){");
dialog.append("android.support.v7.app.AlertDialog.Builder builder = new AlertDialog.Builder(this);");
dialog.append("builder.setTitle(\"Title\")\n");
dialog.append(".setMessage(\"Dialog content\")\n");
dialog.append(".setPositiveButton(\"OK\", new android.content.DialogInterface.OnClickListener() {\n" +
"@Override\n" +
"public void onClick(DialogInterface dialog, int which) {\n" +
"\t\n" +
"}" +
"})\n");
dialog.append(".setNegativeButton(\"Cancel\", new DialogInterface.OnClickListener() {\n" +
"@Override\n" +
"public void onClick(DialogInterface dialog, int which) {\n" +
"\t\n" +
"}" +
"})\n");
dialog.append(".show();");
dialog.append("}");
// 将代码添加到当前类里
targetClass.add(factory.createMethodFromText(dialog.toString(), targetClass));
// 导入需要的类
JavaCodeStyleManager styleManager = JavaCodeStyleManager.getInstance(project);
styleManager.optimizeImports(file);
styleManager.shortenClassReferences(targetClass);
}
}
点击编译器右上角的绿色Run按钮,会重新启动一个新的IntelliJ IDEA的界面,在这里创建一个Android工程,点击Code,会看到Android Dialog选项,看下效果:
部署插件
打开plugin.xml文件,该文件为开发的插件的配置文件,代码如下:
<idea-plugin>
<id>com.your.company.unique.plugin.id</id>
<name>Plugin display name here</name>
<version>1.0</version>
<vendor email="support@yourcompany.com" url="http://www.yourcompany.com">YourCompany</vendor>
<description><![CDATA[
Enter short description for your plugin here.<br>
<em>most HTML tags may be used</em>
]]></description>
<change-notes><![CDATA[
Add change notes here.<br>
<em>most HTML tags may be used</em>
]]>
</change-notes>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="173.0"/>
<!-- please see http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<!-- uncomment to enable plugin in all products
<depends>com.intellij.modules.lang</depends>
-->
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
</extensions>
<actions>
<!-- Add your actions here -->
</actions>
</idea-plugin>
其中 <idea-version since-build="173.0"/>的值需要去http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html找一下 你自己的AndroidStudio版本的对应关系
点击Bulid菜单下的Prepare Plugin按钮会在项目的根目录生成jar插件,如下图所示:
安装插件
打开Andorid Studio,选择File -> Settings -> Plugins -> Install plugin from disk,选择我们生成的jar然后重启即可,如下图所示,红框标记的部分就是我们刚才在plugin.xml文件中填写的信息:
发布插件
还可以把插件发布到仓库,让其他人也能使用,进入 JetBrains 官网,注册账号,提交插件jar包,填写相关信息,等待审核就可以了。
遇到的问题
安装插件的时候出现下面的报错,是因为IDEA中jdk的版本是1.8,而我的Android Studio中jdk的版本是1.7导致的,版本统一就好了。
Android Dialog threw an uncaught PluginException.
.总结
总结一下之前的步骤:
1.下载Intellij IDEA,新建一个Intellij Platform Plugin的项目(注意jdk版本的问题,最新的IDEA需要jdk 1.8版本)
2.在项目中新建一个Action,把继承的AnAction改成BaseGenerateActio
3.编写API,这个可以参考其他插件的写法
4.<idea-version since-build="173.0"/>的值需要去http://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html找一下 你自己的AndroidStudio版本的对应关系
5.点击Bulid菜单下的Prepare Plugin按钮生成jar,这个jar就可以直接用来安装了