Intellij 插件开发-AndroidStudio(二)-文件操作

目录

前言:

一 基础引导

二 读取Layout对象


Intellij 插件开发-AndroidStudio (零)番外

Intellij 插件开发-AndroidStudio(一)--环境构建

 Intellij 插件开发-AndroidStudio(二)-文件操作

 Intellij 插件开发-AndroidStudio(三)-写入生成代码

Intellij 插件开发-AndroidStudio(四)-添加类和模板

前言:

本章节主要讲解怎么操作Android studio的xml文件。as开发的时候,很多人可能跟我一样,觉得不少xml的操作,非常费事费时。所以开发插件的时候,第一个要面临的问题,怎么去操作xml,读取xml中的信息。

扫描二维码关注公众号,回复: 3233593 查看本文章

以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类中,并如何实现格式化。

猜你喜欢

转载自blog.csdn.net/shenjinalin123/article/details/82224168