在IntelliJ模板Recipe类中获取应用包名及跨目录创建需求
解决方案
一、获取Module参数调用getPackageName(module: Module)
在Android Studio插件中,可通过当前选中的文件/目录关联到对应的Module,核心思路是利用ModuleUtil工具类从VirtualFile定位Module:
import com.intellij.openapi.module.ModuleUtil import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VirtualFile // 假设已通过插件上下文获取到当前选中的目录(比如D目录)和Project实例 fun getCurrentModule(selectedDir: VirtualFile, project: Project) = ModuleUtil.findModuleForFile(selectedDir, project) // 使用示例 val module = getCurrentModule(selectedDFile, project) module?.let { val packageName = getPackageName(it) // 后续使用包名逻辑 }
如果是从右键菜单触发的动作,可通过AnActionEvent获取上下文:
import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys override fun actionPerformed(e: AnActionEvent) { val project = e.project ?: return val selectedFile = e.getData(CommonDataKeys.VIRTUAL_FILE) ?: return val module = ModuleUtil.findModuleForFile(selectedFile, project) module?.let { val packageName = getPackageName(it) // 处理包名 } }
二、从子目录定位父目录并创建同级目录
针对你提到的目录结构(A→B→C→D),当处于D目录时,要在A目录下创建与B同级的F目录,可通过以下两种方式实现:
方式1:按固定层级向上回溯
如果目录层级固定(比如从D到A需要向上3级),直接逐级获取父目录:
import com.intellij.openapi.vfs.VirtualFile fun createSiblingDirInParent(currentDir: VirtualFile, levelsUp: Int, newDirName: String) { var targetParent = currentDir // 向上回溯指定层级 repeat(levelsUp) { targetParent = targetParent.parent ?: return // 防止父目录为null } // 创建新目录 targetParent.createChildDirectory(null, newDirName) } // 使用示例:从D目录向上3级到A,创建F目录 createSiblingDirInParent(selectedDFile, 3, "F")
方式2:通过包名匹配定位父目录
如果目录结构对应包名(比如A对应包名前缀com.example,B对应ui),可结合之前获取的包名拆分定位:
import com.intellij.openapi.module.Module import com.intellij.openapi.vfs.VirtualFile fun getModuleJavaSrcDir(module: Module): VirtualFile? { return module.moduleDir.findChild("src")?.findChild("main")?.findChild("java") } fun createDirByPackage(module: Module, packageName: String, targetSegmentsCount: Int, newDirName: String) { val srcDir = getModuleJavaSrcDir(module) ?: return val packageSegments = packageName.split(".") // 取前N段对应A目录 val targetSegments = packageSegments.take(targetSegmentsCount) var targetDir = srcDir targetSegments.forEach { segment -> targetDir = targetDir.findChild(segment) ?: return } // 创建F目录 targetDir.createChildDirectory(null, newDirName) } // 使用示例:假设包名是com.example.ui.activity.home,取前2段对应A目录,创建F createDirByPackage(module, packageName, 2, "F")
内容的提问来源于stack exchange,提问作者Muhammad Ibrahim
相关产品推荐
相关产品推荐

