- 1.3 前言
- 1.4 入门
- 1.4.1 下载
- 1.4.2 环境配置
- 1.4.3 环境配置
- 1.4.4 环境配置
- 1.4.5 版本更新
- 1.4.6 项目和模块
- 1.5 新建
- 1.5.1 创建项目
- 1.5.2 创建模块
- 1.5.3 创建库
- 1.5.4 Library打包成aar
- 1.5.5 Studio项目
- 1.5.6 导入eclipse项目
- 1.5.7 导入Jar\/AAR
- 1.5.8 新建类和文件
- 1.5.9 增加so文件
- 1.5.10 创建Fragment文件
- 1.5.11 创建service文件
- 1.5.12 创建自定义组件
- 1.5.13 widget
- 1.5.14 创建可编译的资源文件
- 1.5.15 创建AIDL
- 1.5.16 创建Android文件夹
- 1.6 布局
- 1.6.5 ConstraintLayout约束
- 1.7.8 TODO
- 1.8 编辑
- 1.8.1 复制\/粘贴\/剪切\/撤销\/重做
- 1.8.2 查找替换
- 1.8.3 大小写替换
- 1.8.4 Macros(宏)
- 1.8.5 使用列选择模式
- 1.8.6 扩大\/缩小选择范围
- 1.8.7 合并两行内容
- 1.8.8 自动补全当前的语句
- 1.8.9 缩排
- 1.8.10 切换大小写字母
- 1.10 导航
- 1.10.1 搜索并打开某个类文件
- 1.10.2 搜索并打开某个文件
- 1.10.3 搜索并打开某个文件或方法
- 1.10.4 快速跳转到某一行
- 1.10.5 使用自定义代码块
- 1.10.6 快速跳转到光标的历史位置
- 1.10.7 快速跳转到编辑过的位置
- 1.10.8 标记书签
- 1.10.9 管理书签
- 1.10.10 快速跳转到导航栏
- 1.10.11 快速跳转到声明
- 1.10.12 快速跳转到类型声明
- 1.10.13 快速跳转到实现
- 1.10.14 快速跳转到父类
- 1.10.15 在快速类和被测试类之间快速跳转
- 1.10.16 查看相关联的文件
- 1.10.17 查看文件结构
- 1.10.18 查看类的层次结构图
- 1.10.19 查看方法类型的层次结构图
- 1.10.20 查看方法调用层次结构
- 1.10.21 快速跳转到错误代码位置
- 1.10.22 方法间前后跳转
- 1.10.23 使用翻页
- 1.10.24 选择当前文件在哪里显示
- 1.10.25 光标快速跳转到编辑器
- 1.11 编码
- 1.11.1 覆写或者实现方法
- 1.11.2 实现接口方法
- 1.11.4 生成构造函数
- 1.11.5 生成Getter和Setter方法
- 1.11.6 覆写equals和hashcode方法
- 1.11.7 快速覆写toString方法
- 1.11.8 插入版权信息
- 1.11.9 提取或删除语句
- 1.11.10 自动补全提示
- 1.11.11 代码补全
- 1.11.12 循环扩展词
- 1.11.13 展开或折叠代码
- 1.11.14 代码模板
- 1.11.15 注释
- 1.11.16 格式化代码
- 1.13 重构
- 1.13.1 重命名
- 1.13.2 提炼方法
- 1.13.3 提炼方法对象
- 1.13.4 更改方法签名
- 1.13.5 迁移变量类型
- 1.13.6 转成静态方法
- 1.13.7 静态方法转为实例方法
- 1.13.8 移动类
- 1.13.9 移动静态方法
- 1.13.10 移动静态字段
- 1.13.11 安全删除
- 1.13.12 提炼为变量
- 1.13.13 提炼为常量
- 1.13.14 提炼字段
- 1.13.15 提炼参数
- 1.13.16 提炼委托
- 1.13.17 提炼接口
- 1.13.18 提炼父类
- 1.13.19 内联方法
- 1.13.20 内联临时变量
- 1.13.21 查找并替换重复代码
- 1.13.22 反转布尔值
- 1.13.23 把成员拉到父类
- 1.13.24 把成员推到子类
- 1.13.25 尽可能使用接口
- 1.13.26 使用委托替换继承
- 1.13.27 移除中间人
- 1.13.28 包装方法返回值
- 1.13.29 将匿名类转成内部类
- 1.13.30 封装字段
- 1.13.31 使用查询替换临时变量
- 1.13.32 使用工厂方法替换构造方法
- 1.13.34 泛型化
- 1.13.35 迁移
- 1.14 打包构建(Gradle)
- 1.14.1 认识Gradle
- 1.14.2 Gradle中依赖的仓库
- 1.14.3 配置Gradle环境
- 1.14.4 Wrapper
- 1.14.5 初始化构建环境
- 1.14.6 解决Gradle下载太慢的问题
- 1.14.7 查看和执行Gradle任务
- 1.14.8 常用Gradle任务
- 1.14.9 Gradle工具窗口
- 1.14.10 构建项目和模块
- 1.14.11 设置自动编译项目
- 1.14.12 重新构建项目
- 1.14.13 Project的区别
- 1.14.14 清理项目
- 1.14.15 Script
- 1.14.16 Gradlew配置文件:gradle-wrapper.properties
- 1.14.17 项目全局配置文件:settings.gradle
- 1.14.18 本地属性配置文件:local.properties
- 1.14.19 Gradle配置文件:gradle.properties
- 1.14.20 代码混淆规则配置文件:proguard-rules.pro
- 1.14.21 项目构建配置文件build.gradle
- 1.14.22 模块构建配置文件:build.gradle
- 1.14.23 项目结构中配置模块构建
- 1.14.24 配置应用程序属性
- 1.14.25 配置应用程序签名
- 1.14.26 配置应用程序的特性
- 1.14.27 配置应用程序的构建类型
- 1.14.28 配置应用程序的依赖
- 1.14.29 打签名包
- 1.14.30 多渠道打包
- 1.14.31 配置开发者服务
- 1.15 运行调试
- 1.15.1 运行和调试配置
- 1.15.2 Android应用程序配置
- 1.15.3 断点
- 1.15.4 调试工具
- 1.15.5 计算表达式
- 1.15.6 关联调试到Android进程
- 1.15.7 配置和运行单元测试
- 1.15.8 使用命令行运行单元测试
- 1.15.9 配置Android单元测试
- 1.17 版本控制
- 1.17.1 Git偏好设置
- 1.17.2 配置Github
- 1.17.3 从Github克隆代码
- 1.17.4 将本地项目共享到GitHub
- 1.17.5 查看本地变更历史
- 1.17.6 Git添加文件
- 1.17.7 Git提交变更
- 1.17.8 Git文件逐行追溯
- 1.17.9 显示当前修订版本
- 1.17.10 Git文件比较
- 1.17.11 Git撤销操作
- 1.17.12 Git版本回退
- 1.17.13 Git查看提交历史
- 1.17.14 Git分支管理
- 1.17.15 Git创建标签
- 1.19 插件
- 1.19.1 插件下载安装
- 1.19.2 常用插件
- 1.19.3 插件开发
- 1.21 快捷键
1.19.3 插件开发
一、概述
相信大家在使用Android Studio的时候,或多或少的会使用一些插件,适当的配合插件可以帮助我们提升一定的开发效率,更加快乐。例如:
https:\/\/github.com\/zzz40500\/GsonFormat 可以帮助我们从Gson转化为实体类https:\/\/github.com\/avast\/android-butterknife-zelezny 可以帮助我们更加方便的使用butterknifehttps:\/\/github.com\/Skykai521\/ECTranslation 可以帮助在IDE里面完成英文->中文的翻译
有句话叫做授人以鱼不如授人以渔,不能一直跟随着别人的脚步去使用插件了,有必要去学习编写插件,当自己有好的创意的时候,就可以自己实现了。So,本文的内容是:
自己编写一个Android Studio插件
ok,其实编写插件并不难,官方也有详细的文档,所以你也可以选择直接阅读下文学习:
http:\/\/www.jetbrains.org\/intellij\/sdk\/docs\/basics\/getting_started.html
为了文章有一定的流畅性,决定以ECTranslation作为编写Android Studio插件的例子。
我为什么选这个呢?因为创意好,实用并且代码简单。
贴一个今天这个插件的最终效果图:
注:效果与ECTranslation基本一致,本文仅用作学习,不造轮子,如果需要使用,直接使用ECTranslation即可。
二、准备工作
首先需要安装IntelliJ IDEA
下载网址:https:\/\/www.jetbrains.com\/idea\/
下载好就可以了~~
然后安装,运行,点击create New Project:
按照上图进行选择,如果没有SDK,则点击New新建一个即可。
然后点击Next,输入项目名称选择位置,就可以点击finish了。
项目的结构如下:
src目录下主要用于存放我们编写的代码。
这样准备工作就结束了~~
三、编码
(1) 关键知识
编码实际上核心的一个类叫做AnAction,可以直接选择NEW->Action,如下图:
然后填写一些相关信息: 需要填写的属性如下:
ActionID:代表该Action的唯一的ID,一般的格式为:pluginName.ID ClassName:类名 Name:就是最终插件在菜单上的名称 Description:对这个Action的描述信息
然后往下,选择这个Action即将存在的位置:
我们选择的是EditMenu,右侧选择为first,即EditMenu下的第一个,效果如图: 再往下就是制定快捷键了~~
都填写完成就可以点击OK了。
点击ok之后,可以看到为我们生成了下类:
public class TranslateAction extends AnAction {
@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
}
}
此外我们刚才填写的信息,也在plugin.xml中完成了注册,大家可以进去看一眼,actions的标签中,
当我们点击菜单的时候,就回触发actionPerformed()
方法。
那么这么看,我们在这个方法中只要完成三件事:
获得当前选中的单词 调用相关API得到单词的意思 通过一个类似于PopupWindow来显示
当然,为了尽快的测试,你可以先在里面弹一个对话框,例如如下:
public void actionPerformed(AnActionEvent event) {
Messages.showMessageDialog("Hello World !", "Information", Messages.getInformationIcon());
}
预期效果是点击Tranlate菜单,或者按快捷键会弹出一个提示对话框。
那么点击Run: 然后它会默认启动一个新的IntelliJ IDEA的界面,你可以随便新建一个项目,进入以后,你会发现Edit下多了一个Translate菜单,点击即可弹出我们设定的对话框: ok,测试通过就放心了~
获得当前选中的单词 调用相关API得到单词的意思 通过一个类似于PopupWindow来显示
剩下的就是功能性的API了~
(2) 获得当前选中的单词
@Override
public void actionPerformed(AnActionEvent e) {
// TODO: insert action logic here
final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);
if (null == mEditor) {
return;
}
SelectionModel model = mEditor.getSelectionModel();
final String selectedText = model.getSelectedText();
if (TextUtils.isEmpty(selectedText)) {
return;
}
}
是不是觉得API很陌生,恩,我也觉得很陌生,关于API这里介绍其实没什么意义,本文主要目的是让大家对自定义插件有个类helloworld的认识,至于插件里面的代码涉及到的API等到大家需要编写插件的时候,再详细学习就好了,现在就不要浪费精力记忆这些东西了。
上面的代码就是获得选中的文本,通过一个Editor,然后拿到SelectionModel,再拿到selectedText,从字面上还是蛮好理解的。
拿到选中的文本之后,应该就是去查询该单词的意思了,查询呢,ECTranslation用的是youdao的Open SDK,其实也很简单,就是拼接一个url,然后等着解析返回数据就好了。
(3)调用相关API得到单词的意思
有道API的地址:
http:\/\/fanyi.youdao.com\/openapi?path=data-mode
大家如果想要做单词翻译,可以看下,非常简单。
涉及到的代码:
String baseUrl = "http://fanyi.youdao.com/openapi.do?keyfrom=Skykai521&key=977124034&type=data&doctype=json&version=1.1&q=";
HttpUtils.doGetAsyn(baseUrl + selectedText, new HttpUtils.CallBack() {
public void onRequestComplete(String result) {
Translation translation = gson.fromJson(result, Translation.class);
showPopupBalloon(mEditor, translation.toString());
}
});
HttpUtils就不贴了,就是直接开了个线程,通过HttpUrlConnection去访问网络,大家的项目中或者通过搜索引擎,代码一搜一堆。
baseUrl就是有道的url,加上我们选中的单词就是完整的url了,然后通过http访问,callback回调出返回的字符串,这里返回的是json类型的字符串。
baseUri是:
我们根据返回的json字符串生成了一个类Translation;
然后通过Gson转化为Translation对象。
ps:拿着上面的baseUrl后面跟一个任何单词,直接访问浏览器就能看到返回的json数据了,这里大家天天写接口,类似的步骤比我肯定还熟悉。
好了,有了返回的数据以后,直接通过一个类似popupWindow展现即可。
(4)通过一个类似于PopupWindow来显示
涉及到的代码:
private void showPopupBalloon(final Editor editor, final String result) {
ApplicationManager.getApplication().invokeLater(new Runnable() {
public void run() {
JBPopupFactory factory = JBPopupFactory.getInstance();
factory.createHtmlTextBalloonBuilder(result, null, new JBColor(new Color(186, 238, 186), new Color(73, 117, 73)), null)
.setFadeoutTime(5000)
.createBalloon()
.show(factory.guessBestPopupLocation(editor), Balloon.Position.below);
}
});
}
这个API,恩,我copy的源码,依然是不求记住,知道这有个类似的功能即可。
简单看一下,是通过创建一个JBPopupFactory,然后通过它创建一个HtmlTextBalloonBuilder,通过这个builder去设置各种参数,最后show。
ok,对于一个入门的例子,不要太强求对插件中这些API的掌握,还是那句话,等需要写了再去查,需要什么功能,哪怕到对应的插件中去copy源码都可以,当然也有文档:
http:\/\/www.jetbrains.org\/intellij\/sdk\/docs\/tutorials.html
有兴趣的可以整理各种类型的插件,比如弹出popupWindow,生成代码,生成文件类别的,然后对相关的API进行收集与整理。
这样代码写完了,先测试一下,点击RUN,然后看效果~
我们这里肯定是测试没问题的,效果图就是开始的那个gif.
如果没有问题,就可以去部署和发布我们的插件给别人去使用了。
这两部也非常简单。
四、部署插件
(1)填写插件相关信息
打开项目文件的plugin.xml,如下图: 在里面填写id,name,version等。。。记得随便填一下~
然后,点击build->prepare plugin…,如下图: 会在项目的根目录生成一个jar,如图: 这个jar就可以用于安装了。
(2)安装插件
打开Andorid Studio,选择Preferences -> Plugins -> Install plugin from disk,选择我们生成的jar即可,如图: 点击安装,然后重启即可。
好了,重启完成就可以在EDIT下看到Translate菜单了,选中单词,点击菜单或者快捷键都能实现翻译了。
如果你有兴趣,赶紧编写一个插件自己玩吧。
当然,还可以把我们的插件发布到仓库,支持在plugin中搜索安装,参考:
http:\/\/www.jetbrains.org\/intellij\/sdk\/docs\/basics\/getting_started\/publishing_plugin.html
就是注册账号,提交jar,填写信息,等着审核就可以了。
五、总结
终于到了总结的环节,这么长的文章其实编写插件总结起来就几句话。
下载Intellij IDEA,新建一个Intellij IDEA plugin的项目 然后在里面new Action以及编写API 点击prepare plugin生成jar,这个jar就可以用来安装了。
恩,就是这么简单,实践起来会比较麻烦一点,等成功以后,回过头来总结,发现步骤其实就那么几个步骤~~对于实际的Action相关的API,等你在编写相关插件的时候,参考别的类似插件,查看官方文档都可以。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论