目录
Intellij 插件开发-AndroidStudio (零)番外
Intellij 插件开发-AndroidStudio(一)--环境构建
Intellij 插件开发-AndroidStudio(二)-文件操作
Intellij 插件开发-AndroidStudio(三)-写入生成代码
Intellij 插件开发-AndroidStudio(四)-添加类和模板
前言:
本章节主要讲解怎么操作Android studio的xml文件。as开发的时候,很多人可能跟我一样,觉得不少xml的操作,非常费事费时。所以开发插件的时候,第一个要面临的问题,怎么去操作xml,读取xml中的信息。
以Project实例进行分步讲解。
Project 实例说明:根据layout中的view控件,自动生成java对象和代码。
一 基础引导
要快速上手开发,几乎跟所有工程的开发一样,我们先要属性开发插件时候的基本流程。
关键字 Project Editor PsiFile PsiClass
首先插件开发中,无非就是对工程,还有文件的操作。读取一些属性,在写入一些东西。说白了其实就是这么简单的事。
那么接下来的思路就比较清晰了。以实例为例,实例的实现思路很明确
读取xml view对象的id,通过id生成对象代码,写入目标activity中
二 读取Layout对象
如何才能读取到layout文件中的对象,首先你得先把安卓工程目录结构中的layout文件找到。
如何找安卓工程的文件,我们来看下一段代码
关键字 FilenameIndex GlobalSearchScope
FilenameIndex字面意思可以看出,如果要找文件,多半都是要用到他了。
GlobalSearchScope 这个类的命名也基本能猜个大概,搜索范围。这两个类是搭配使用的。
@Nullable
public static PsiFile findXmlResource(Project project, String layoutName) {
if (!layoutName.startsWith("R.layout.")) {
return null;
}
layoutName = layoutName.substring("R.layout.".length());
String name = String.format("%s.xml", layoutName);
PsiFile[] foundFiles = FilenameIndex.getFilesByName(project, name, GlobalSearchScope.allScope(project));
if (foundFiles.length <= 0) {
return null;
}
return foundFiles[0];
}
可以看出,关键代码就是FilenameIndex.getFilesByName(project, name, GlobalSearchScope.allScope(project))这行。根据layout的名字,在安卓工程的系统中查找layout xml文件。
这里看出,这个方法需要用到两个对象,Project , layoutName。这两个参数从哪儿来,我们来看另一段代码,当我们的action创建的时候,是否还记得这个方法,public void actionPerformed(AnActionEvent anActionEvent);
project和layoutname就从这里来
@Override
public void actionPerformed(AnActionEvent anActionEvent) {
//获取当前工程的Project对象
Project fatherProject = anActionEvent.getProject();
if (fatherProject == null) {
return;
}
//获取编辑器 String layoutName = editor.getSelectionModel().getSelectedText(); 获取编辑器选中的文字内容
Editor editor = CommonDataKeys.EDITOR.getData(anActionEvent.getDataContext());
if (editor == null) {
return;
}
PsiFile file = anActionEvent.getData(PlatformDataKeys.PSI_FILE);
if (file == null) {
return;
}
loadFile(fatherProject, editor, file);
}
获取到了文件之后,我们就可以解析文件,获取里面的view对象了
/**
* AndroidView是自己定义的对象,不用太在意,用来装填数据
* @param f
* @return
*/
@NotNull
public static List<AndroidView> getIDsFromXML(@NotNull PsiFile f) {
final ArrayList<AndroidView> ret = new ArrayList<AndroidView>();
f.accept(new XmlRecursiveElementVisitor() {
@Override
public void visitElement(final PsiElement element) {
super.visitElement(element);
if (element instanceof XmlTag) {
//遍历layout文件中所有的psiElement对象如果是xmlTag的就读取属性。
//这里的xmlTag就是View的类型开头,如:<TextView
XmlTag t = (XmlTag) element;
XmlAttribute id = t.getAttribute("android:id", null);
if (id == null) {
return;
}
final String val = id.getValue();
if (val == null) {
return;
}
ret.add(new AndroidView(val, t.getName(), id));
}
}
});
return ret;
}
上面的代码还是比较易懂的。
至此,读取layout文件中的view对象的工作就到此结束了。
下一章节,我们讲解如何将读取到的数据,添加到java类中,并如何实现格式化。