新来一个项目,发现有不少界面,代码可以直接从旧的项目copy。在copy图片资源的时候,很蛋疼,打开xml布局,找到图片,点击打开,copy… paste… ??? 竟然无法粘贴到桌面! . 只能粘贴到可以编辑的word 文档,qq编辑框之类的地方。
这就坑爹了。 只好到Project视图中 浩如烟海的资源drawable目录中去找我那一个小小的.png。
虽然可以搜索,但是仍然很慢啊!
copy paste打法效率大打折扣。
当时项目beta版本工期紧,在AndroidStudio的Plugin 仓库中各种关键词搜索 Go To Project View ,Navigator to .., find in …啊等等,没找到想要的插件,只好作罢。
最近比较闲,打算自己动手丰衣足食。 花了3天off hours。搞定。。 最终只用了5行代码。
不过过程还是比较坎坷:
1.先百度,看了几个教程。发现基本都是新建一个action从 public void actionPerformed1(AnActionEvent e)这个方法入手。
新建action的时候会有groups选择。查阅文档了解到jetbrains 将 其Ide的各类菜单分类各种groups,旁边的actions是这一个groups中的一个选项。。 选择了哪个groups,通过anchor 指定位置,就会把你设置的按钮放置到哪。
比如我指定Navigator ,Anchor first,插件安装后就出现在了这里
AnActionEvent e 。类似于MotionEvent e。actionPerformed方法中获取事件e进行处理。
尝试在该方法中再次调用actionPerformed,运行插件,点击我设置的按钮FindInProjectView,果然出现了Stackoverflow。。无限递归。
鸿杨的开发Plugin教程中使用e.getData(PlatformDataKeys.EDITOR) ,通过PlatformDataKeys.EDITOR 这个 key值可以获得当前我选中的文本。
2 ok,开始尝试各种key能获取到的信息。各种debug,evaluate.evaluate是个好东西,可以尝试各种表达式的值。
仔细想想我的需求:
1首先必然要找到我选中的文件名
2.搜索到该文件
3.在project view中找到该文件并选中它。
是的,PlatformDataKeys.EDITOR 可以拿到选中的文本,那我就最简单的这一步开始,选中我要找的资源文件名,搜索。
翻jetbrains 的文档,发现他的文件组织形式有2种。
It supports two main types of indexes:
File-based indexes
Stub indexes
使用第一种。FilenameIndex.getFilesByName.. 查找bottom,竟然返回空。
果断evaluate 看一下FilenameIndex.getAllFilenames 返回结果。果然返回了一个巨大无比的数组,可是查找bottom 为何是空?
尝试 自己加了一个后缀 .png查找,果断找到了他。
剩下的就是跳转的问题了。猜到 ProjectView 应该是属于另外一个组件,使用PlatformDataKeys.CONTEXT_COMPONENT 这个key搜索一下,
Component component = e.getData(PlatformDataKeys.CONTEXT_COMPONENT);
String name = component.getName();
确实选中projectview时,可以拿到这个component的名字,选中其他组件时,显示的是其他组件的名字。然而怎么跳转?
PsiFile 各种尝试,发现有一个navigate(boolean var1)方法,咦~~ 这不就是navigate到这个文件的意思么 果断navigate( true)一个。发现确实是跳转了,但是是跳转到navigator bar 了。
线索中断…
第二天,忙完了又试了试,无意间发现每一个component都可以getInstance。果断尝试
ProjectView.getInstance(e.getProject()),发现有一个selectPsiElement方法
尝试之..ProjectView.getInstance(e.getProject()).selectPsiElement(filesByName[0], true);
完美。跳转了。
3.插件写完发布了,才发现.. tmd 原来跳转到navigator bar 再右键复制 就可以直接粘贴到桌面了。TMD 这真是一个悲伤的故事。
but,也许快速跳转到project view 除了复制之外 还有别的用处呢。总之,下次还有需求起码可以快速开撸了~~
想想还是很开心呢~