You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:35:30