参考资料
1.Intellij Idea插件开发--Android文件修改
https://juejin.im/post/6844903919852748814#heading-10
2.Android Studio 插件
https://github.com/PegasusCharles/Android-Studio-Plugins-cn
3.Android Studio 常用插件及浅释
https://github.com/jp1017/AndroidStudioPlugins
4.
问题
1.动态穿件的 多个jtextfield 如何实现数据修改 监听 绑定
JTextField textField1 = new JTextField();
textField1.setPreferredSize(new Dimension(0,20));
textField1.setName(","+i);
textField1.addFocusListener(new MyFocusListener());
textField1可以设置一个 id 然后注册 FocusListener
public void focusLost(FocusEvent e) {//失去焦点
JTextField source = (JTextField) e.getSource();
String text = source.getText();
String uiClassID = source.getUIClassID();
Keymap keymap = source.getKeymap();
System.out.println("*********FocusEvent************"+source.getName());
}
source.getName()既可以 拿到 当前的 JTextField 控件
2. 页面的布局
Container container = jDialog.getContentPane();
//整个页面的 布局 是 垂直
container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
//整个页面的 布局 是 水平
container.setLayout(new BoxLayout(container, BoxLayout.X_AXIS));
3. 用 gson 把 json 转 bean 这个 是list嵌套list
/**
* @param json list的序列化字符串
* @param <T> T类型
* @return List<T>
*/
public static <T> List<T> toList(String json, Class<T> clazz) {
List<T> list = new ArrayList<>();
try {
JsonArray array = new JsonParser().parse(json).getAsJsonArray();
for (final JsonElement elem : array) {
list.add(new Gson().fromJson(elem, clazz));
}
} catch (Exception e) {
return null;
}
return list;
}
非嵌套list
public static <T> T jsonToList(String strJsonData, Class<?> cls) {
Gson gson = new Gson();
T t = gson.fromJson(strJsonData, new TypeToken<T>(){}.getType());
return t;
}
4. PsiFile 读取文件 转 File
getPsiFile
//获取指定名称的文件
public static PsiFile getPsiFile(Project project, String fileName) {
PsiFile[] psiFiles = FilenameIndex.getFilesByName(project, fileName, GlobalSearchScope.allScope(project));
PsiFile psiFile = psiFiles[0];
return psiFile;
}
PsiFile psiFile = PsiElementUtils.getPsiFile(project, "文件");
VirtualFile virtualFile = psiFile.getVirtualFile();
File jsonFile = new File(virtualFile.getCanonicalPath());
5. 正则匹配 单行注释 开头 注释开头
String commentsStr = "//this is single line comments";
Pattern singleLineCommentP = Pattern.compile("^//.*?$");
boolean matches = commentsStr.matches("^//.*?$");
System.out.println(matches);
6. 难点
- 写入 gradle 文件
- initial.replace(replacement); 可以把一正行 替换掉 测试中 如果 行里 有 . 并且没有在双引号里面 写入 文件以后 . 两边有空格
com.dev 写入以后 则会 com . dev
如果在双引号 里面 则没有问题
"com.cain.join"
public static void replacePsiElement2(PsiElement initial, String replacetext, @NotNull Project project) {
PsiElementFactory psiElementFactory = JavaPsiFacade.getInstance(project).getElementFactory();
PsiElement replacement = psiElementFactory.createExpressionFromText(replacetext.trim(),null);
ApplicationManager.getApplication().invokeLater(() ->
WriteCommandAction.runWriteCommandAction(project, () -> {
//initial.getParent().add(replacement, initial);
initial.getLastChild().replace(replacement);
//initial.getParent().replace(replacement);
//initial.(replacement);
}));
}
解决:
- 试 字符转义 StringBuffer 拼接 等 解决不来这个问题
换个思路 如果只 截取 替换 后半部分 因为一行里 是这样的格式
dev.getversion = "com.cain.jioin:2.3.4"
只取 后半部分 暂时解决这个问题
initial.getLastChild().replace(replacement);
看了一下源码太多 没有时间看了 不知道 为什么写入 gradle 文件 . 前后会有空格 大神有解决的 可以指教一下!!
7. Files 也可以 修改文件
PsiFile[] allGradles = FilenameIndex.getFilesByName(project, "build.gradle",
GlobalSearchScope.allScope(project));
for (PsiFile gradleFile: allGradles){
String text = gradleFile.getText();
if (text.contains(BEGIN)){
VirtualFile virtualFile = gradleFile.getVirtualFile();
try {
List<String> list = Files.readAllLines(Paths.get(virtualFile.getCanonicalPath()));
if(!list.contains(" " + MATERIAL_LIB)){
list.add(list.size() - 1, " " + MATERIAL_LIB);
Files.write(Paths.get(virtualFile.getCanonicalPath()), list);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
8. 打印PsiElement元素
public static void printPsiElement(PsiFile psiFile) {
PsiElement[] psiElements = psiFile.getChildren();
System.out.println("psiElements---"+psiElements.length);
for (PsiElement psiElement : psiElements) {
System.out.println("psiElement---"+psiElement.getText());
System.out.println("getChildren---"+psiElement.getChildren().length);
if (psiElement.getChildren().length == 0) continue;
System.out.println("getFirstChild---"+psiElement.getFirstChild().getText());
System.out.println("getLastChild---"+psiElement.getLastChild().getText());
System.out.println("getOriginalElement---"+psiElement.getOriginalElement().getText());
}
}
9.
遇到的问题 比 记录的要多啊
这次插件的开发过程简直是痛并快乐着的一次体验,坚持就是胜利,解决了一个又一个问题 因为现有大部分关于IDEA插件的开发文章都是比较简单的介绍,特别是针对Android文件(包括gradle文件,properties文件,AndroidManifest.xml文件)的修改更是难找。修改gradle文件 的 文档机会没有 谷歌了一下 也没什么可以借鉴的 所以,关于这些文件的修改开发,都是靠类比Java文件结构推理,查看IDEA 插件SDK API以及不断尝试完成的。
网友评论