博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
教你开发一款属于自己的Android Studio插件
阅读量:6109 次
发布时间:2019-06-20

本文共 9094 字,大约阅读时间需要 30 分钟。

开发一款Android Studio插件

开头提一句

在我们使用Android Studio开发的过程中,插件(Plugin)绝对是一个非常给力的助力。我们常用的的插件,比如说:GsonFormat、Android ButterKnife Zelezny、findBugs-IDEA、JsonOnlineViewer等等等,当然这不是我们今天要说的重点,今天的主题是,我们能不能自己开发一款能实现自己的需求的插件呢?答案当然是,可以的!

工具:IDEA

IDEA的下载和安装我们就不说了。直接去就可以了。随便提一下,官网提供了旗舰版(Ultimate,收费)和社区版(Community,免费),这里开发插件使用社区版就可以了。

开始Coding啦

对于IDEA插件的开发,进行了比较详细的描述,当然可能要考验考验你的英语阅读能力了,因为是纯英文的。

1. 新建项目

2. 项目结构

我们还要基本了解了解项目的结构,我们就介绍介绍用到的几个文件吧。

(1)resources文件夹

顾名思义,这是资源文件夹,我们的图片资源需要本文件夹下。如图所示,我是新建了一个icons文件夹,并放入了一张gradle.svg的图片。plugin.xml文件有点像是配置文件,插件的名称,版本,描述,更新日志,以及Action的声明均是在这里进行,这个我们在后文中会详细说明。

(2)src文件夹

我们的代码文件均是在这里进行,如图所示,我已找自己的习惯,进行了文件夹的新建和命名。

(3)lib文件夹

(项目新建后没有的话,自己新建一个文件夹,命名为lib即可)

2. 新建Action

这里的Action就好像Android开发中的的Activity。

(1)我们右键action文件夹,新建 -> Plugin DevKit -> Action

(2)Action信息填写

import com.intellij.openapi.actionSystem.AnAction;import com.intellij.openapi.actionSystem.AnActionEvent;import com.intellij.openapi.ui.Messages;public class MyPluginAction extends AnAction {    @Override    public void actionPerformed(AnActionEvent e) {        Messages.showMessageDialog("我是一条消息", "提示", Messages.getInformationIcon());    }}复制代码

(3)测试Action:我们编写成功后点击Run按钮或是Shift + F10即可。

我们执行代码后,会自动打开一个新的IDEA,这个IDEA是已经安装了我们插件的。如图可以看到,在Build下Build Module后面已经多了一个MyPlugin的项目。我们点击,立即出现一个对话框。当然,我们直接点击我们设置的快捷键(Ctrl + Alt+ 8)也可以。

3. 一个简单的Demo

我这里简单的实现一个Demo。需求如下:

  • 位置位于Tool组最后(快捷键:Ctrl + Alt + 5),而且需要一个图标。
  • 点击后弹出对话框,显示三方库和版本
  • 选择项目后,即可自动导入三方库导入代码
  • 可以从网络获取最新版本,可以重置到初始值,可以支持Kotlin语言

(1)Action的新建我就不再说了。由于这里需要在两个位置显示,而且需要图标,所以我们需要在plugin.xml中添加点代码。

复制代码

(2)新建对话框

我们需要显示一个相对复杂的对话框,所以我们要自定义布局。我们右键ui文件夹,New一个Dialog,随便去一个名字即可

(3)自定义布局

新建Dialog后,会生成两个文件HomeDialog.java和HomeDialog.form,这有点像是Android中的java和xml文件。form文件是可视化操作,很是方便。这是我自定义的布局。

(4)添加表格

我们在form文件拖动控件后,要给每个控件都命名一个field name后才能使用。我在上图中家加了四个JButton和一个JCheckBox。上部分的空白是一个JBanel,命名为了tablePane。会用来放一个表格,用于显示列表数据。

// 声明一个JBTableJBTable table = new JBTable(new MyTableModel());table.setPreferredScrollableViewportSize(new Dimension(800, 300));table.setFillsViewportHeight(true);// 声明一个JBScrollPane,把JBTable放进去JBScrollPane scrollPane = new JBScrollPane(table);tablePane.setLayout(new GridLayout(1, 0));// 在tablePane中加入scrollPanetablePane.add(scrollPane);复制代码

(5)显示本地数据

我们要设置表格的列标题,并填充数据,就需要自定义TableModel

private class MyTableModel extends AbstractTableModel {        private String[] columnNames = {
"", "Repository", "Version", "Address"}; @Override public int getRowCount() { return ALL_DATA.length; } @Override public int getColumnCount() { return columnNames.length; } @Override public String getColumnName(int column) { return columnNames[column]; } @Override public Class
getColumnClass(int columnIndex) { return getValueAt(0, columnIndex).getClass(); } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return columnIndex == 0 || columnIndex == 2; } @Override public Object getValueAt(int rowIndex, int columnIndex) { Object o; switch (columnIndex) { case 0: { o = ALL_DATA[rowIndex].isChoose(); break; } case 1: { o = ALL_DATA[rowIndex].getName(); break; } case 2: { o = ALL_DATA[rowIndex].getVersion(); break; } case 3: { o = "Github"; break; } default: { o = ""; break; } } return o; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { switch (columnIndex) { case 0: ALL_DATA[rowIndex].setChoose((boolean) aValue); break; case 2: ALL_DATA[rowIndex].setVersion((String) aValue); break; default: break; } fireTableCellUpdated(rowIndex, columnIndex); } }复制代码

(6)选中后添加代码

我们在当前界面获取光标的位置,在后面添加代码即可。

private void insetStringAfterOffset(AnActionEvent e, Repository[] data) {        Editor editor = e.getRequiredData(CommonDataKeys.EDITOR);        CaretModel caretModel = editor.getCaretModel();        int offset = caretModel.getOffset(); // 当前光标位置        WriteCommandAction.runWriteCommandAction(e.getProject(), new Runnable() {            @Override            public void run() {                for (Repository resp : data) {                    if (resp.isChoose()) {                        String impl = "\n    // " + resp.getName() + "\n    implementation \'" + resp.getGradle() + resp.getVersion() + "\'";                        if (!resp.getProcessor().isEmpty()) {                            if (kotlinCheckBox.isSelected()) {                                impl += "\n    kapt \'" + resp.getProcessor() + resp.getVersion() + "\'";                            } else {                                impl += "\n    annotationProcessor \'" + resp.getProcessor() + resp.getVersion() + "\'";                            }                        }                        editor.getDocument().insertString(offset, impl);                    }                }            }        });      	// 显示通知消息        showNotification("implementation", "Auto Gradle", "implementation success");    }复制代码

(7)显示通知消息

这里的通知消息是会在右下角显示的消息,有点像Android中的Toast。

private void showNotification(String displayId, String title, String message) {        NotificationGroup noti = new NotificationGroup(displayId, NotificationDisplayType.BALLOON, true);        noti.createNotification(                title,                message,                NotificationType.INFORMATION,                null        ).notify(event.getProject());    }复制代码

(8)获取项目的最新版本

获取最新版本,我用了github的API,。Json解析用了,网络请求用了和。下载JAR包,复制进lib,add as library即可,和Android是一样的,

private void getLastestTag(int row, JBTable table) {        Repository repository = ALL_DATA[row];        String url = "https://api.github.com/repos/" + repository.getUser() + "/" + repository.getName() + "/releases/latest";        OkHttpClient client = new OkHttpClient();        final Request request = new Request.Builder()                .url(url)                .get()//默认就是GET请求,可以不写                .build();        Call call = client.newCall(request);        call.enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                showNotification(repository.getName(), "错误提示", repository.getName() + " 版本查询失败");                e.printStackTrace();            }            @Override            public void onResponse(Call call, Response response) throws IOException {                Resp bean = JSON.parseObject(response.body().string(), Resp.class);                table.setValueAt(bean.getTag_name(), row, 2);                showNotification(repository.getName(), "更新成功", repository.getName() + " 更新完成:" + bean.getTag_name());            }        });    }复制代码

(9)编写插件信息,测试和总结

以上就是主要的代码逻辑,开发完成后,在plugin.xml文件中编写插件的基本信息。包括:插件ID,名称,版本号,开发者信息,插件描述和更新信息。

com.jiangyy.auto-gradle
AutoGradle
1.0.0
http://www.github.com/jyygithub/AutoGradle
AutoGradle

GitHub | Issues |

A auto import gradle project plugin.

Usage:

  • Ctrl + Alt + 5
  • Tool -> AutoGradle
  • Click the button below

toolbar_logo.png

The following figure is the operation interface

screenshots.png

Send feedback

]]>
  • 初始版本
  • Full Changelog History ]]>
    复制代码

    完整项目代码已上传到。这是最后的简介效果图:

    打包上架

    (1)生成压缩包

    插件编写完成后,点击 Build -> Prepare Plguin Module 'AutoGradle' For Deployment 即可在项目根目录生成一个同名zip文件。

    (2)上传到插件中心

    • 进入,登录你的账号。
    • 选择Upload plugin
    • 上传插件,完善插件信息,提交即可。(上传成功后,需要等待审核通过才能在插件市场搜到)

    转载地址:http://qmsza.baihongyu.com/

    你可能感兴趣的文章
    在mac OS10.10下安装 cocoapods遇到的一些问题
    查看>>
    angularjs表达式中的HTML内容,如何不转义,直接表现为html元素
    查看>>
    css技巧
    查看>>
    Tyvj 1728 普通平衡树
    查看>>
    [Usaco2015 dec]Max Flow
    查看>>
    javascript性能优化
    查看>>
    多路归并排序之败者树
    查看>>
    java连接MySql数据库
    查看>>
    转:Vue keep-alive实践总结
    查看>>
    android studio修改新项目package名称
    查看>>
    深入python的set和dict
    查看>>
    C++ 11 lambda
    查看>>
    Hadoop2.5.0 搭建实录
    查看>>
    实验吧 recursive write up
    查看>>
    High-speed Charting Control--MFC绘制图表(折线图、饼图、柱形图)控件
    查看>>
    go test命令參数问题
    查看>>
    linux 搜索文本
    查看>>
    超实用Mac软件分享(二)
    查看>>
    Android JSON数据解析
    查看>>
    DEV实现日期时间效果
    查看>>