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