Android 工具開發-基於intellij(二)-文件操作

目錄

前言:

一 基礎引導

二 讀取Layout對象


Intellij 插件開發-AndroidStudio (零)番外

Intellij 插件開發-AndroidStudio(一)--環境構建

 Intellij 插件開發-AndroidStudio(二)-文件操作

 Intellij 插件開發-AndroidStudio(三)-寫入生成代碼

Intellij 插件開發-AndroidStudio(四)-添加類和模板

 

前言:

本章節主要講解怎麼操作Android studio的xml文件。as開發的時候,很多人可能跟我一樣,覺得不少xml的操作,非常費事費時。所以開發插件的時候,第一個要面臨的問題,怎麼去操作xml,讀取xml中的信息。

以Project實例進行分步講解。

Project 實例說明:根據layout中的view控件,自動生成java對象和代碼。

打個廣告,自己寫的代碼生成插件,自動生成很多實用代碼:

https://github.com/JianLin-Shen/MZSluggard-code

一 基礎引導

要快速上手開發,幾乎跟所有工程的開發一樣,我們先要屬性開發插件時候的基本流程。

關鍵字 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類中,並如何實現格式化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章