gradle中设置变量,在代码中读取

本文介绍了如何在Android项目的gradlew文件中设置变量appModelCode,以及如何在AndroidManifest.xml中使用这些变量。同时,展示了如何通过getApplicationPlaceholders方法获取XML中的值。

在app的gradlew文件中设置变量appModelCode,设置manifestPlaceholders

android {
    def appModelCode = 1 //1:模式1 2:模式2
    def appModelName = "model1"
    if (appModelCode == 1) {
        ...
    }

    defaultConfig {
        applicationId appId
        minSdk 26
        targetSdk 32
        versionCode appVerCode
        versionName appVerName

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        manifestPlaceholders = [
                appName     : appModeName,
                appModelCode: appModelCode,
                appModeName : appModeName
        ]
    }
}

在AndroidManifest.xml中的application标签中设置

<application>
    <meta-data android:name="appModelCode" android:value="${appModelCode}"/>
    <meta-data android:name="appModeName" android:value="${appModeName}"/>
</application>

代码中获取AndroidManifest.xml中的值

int code = (Integer) AppUtil.getApplicationPlaceholders(this, "appModelCode");
String name = (String) AppUtil.getApplicationPlaceholders(this, "appModeName");

getApplicationPlaceholders方法

/**
     * 在Application获取 manifestPlaceholders 的值
     *
     * @param context
     * @param key
     * @return
     */
    public static Object getApplicationPlaceholders(Context context, String key) {

        Object placeholdersValues = null;
        try {
            ApplicationInfo appInfo = context.getPackageManager().getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
            if (appInfo == null) {
                return placeholdersValues;
            }
            Bundle metaData = appInfo.metaData;
            if (metaData == null) {
                return placeholdersValues;
            }
                placeholdersValues = metaData.get(key);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return placeholdersValues;
    }

<think>好的,用户现在问的是如何在IntelliJ IDEA中设置变量,以便在代码中直接引用。之前他们已经问过关于配置文件模板生成作者和日期的问题,现在这个问题可能是在那个基础上的延伸,或者他们想更灵活地使用变量。 首先,我需要确认用户所说的“设置变量”具体指的是什么。可能有两种情况:一种是在文件模板中使用预定义的变量,比如之前提到的${USER}或者${DATE};另一种是在代码中定义变量,并通过某种方式让IDEA识别并在其他地方引用,比如配置项或者动态替换。 根据之前的对话,用户已经了解了文件模板中的变量使用,所以这次可能更倾向于后者。但用户提到“能在代码中直接引用”,可能是指在编写代码时,能够使用某个变量,然后在运行或生成代码时替换成实际的值,比如配置参数、环境变量或者项目属性。 接下来,我需要考虑IDEA中支持哪些变量设置方式。比如,Live Templates允许用户自定义代码片段,并插入变量;另外,Run/Debug配置中可以设置环境变量,供程序运行时使用;还有在构建工具如Maven或Gradle中定义的属性,也可以在代码中通过注解或资源文件引用。 还需要区分不同的使用场景:是开发代码中的常量,还是运行时动态获取的变量,或者是代码生成时的替换。用户可能希望减少硬编码,通过配置来管理变量,比如API密钥、服务器地址等。 另外,用户可能不了解IDEA的具体功能名称,比如Live Templates或Run Configurations,需要用通俗的语言解释。同时,需要给出具体的步骤和示例,让用户能够跟着操作。 可能存在误区需要澄清:比如,IDEA中的变量代码中的变量是不同的概念,前者是IDE层面的配置,后者是程序中的变量。需要明确说明如何在IDE中设置,并在代码中使用这些值,可能需要结合不同的方法。 最后,总结几种常见的变量设置方式,包括模板变量、环境变量、项目属性、自定义配置文件等,并说明它们的适用场景和配置步骤,确保用户能根据需求选择合适的方法。</think>在 IntelliJ IDEA 中,可通过 **预定义变量** 和 **自定义变量** 实现代码中直接引用动态值。以下是 5 种典型场景的配置方法: --- ### **1. 模板变量(自动替换)** **适用场景**:文件模板、代码片段中快速插入动态值 **配置步骤**: 1. 打开 `Settings` → `Editor` → `File and Code Templates` 2. 在模板中使用内置变量(支持表达式): ```java // 示例:Java 类模板 public class ${NAME} { public static final String VERSION = "${YEAR}-${MONTH}-${DAY}"; // 输出:2024-01-01 private String id = "${UUID.randomUUID().toString()}"; // 生成随机UUID } ``` **内置变量清单**: - `${PROJECT_NAME}`:当前项目名 - `${NAME}`:新建文件时输入的名称 - `${USER}`:操作系统用户名 - `${DATE}`/`${TIME}`:ISO 格式日期时间 - `${DS}`:`$` 符号(用于转义) --- ### **2. 环境变量(运行时读取)** **适用场景**:程序运行时动态获取系统变量 **配置步骤**: 1. 打开 `Run` → `Edit Configurations` 2. 在 `Environment variables` 字段添加变量: ```properties API_KEY=123456;ENV=dev ``` 3. 代码中通过 `System.getenv()` 读取: ```java String apiKey = System.getenv("API_KEY"); // 输出 123456 ``` --- ### **3. 项目属性(跨模块共享)** **适用场景**:Gradle/Maven 项目统一管理变量 **示例(Gradle)**: 1. 在 `build.gradle` 定义变量: ```groovy ext { appVersion = "2.0.0" // 自定义属性 } ``` 2. 代码中通过注解生成配置类(需结合 `@ConfigurationProperties` 或 Lombok): ```java @Value("${appVersion}") // Spring Boot 注解 private String version; ``` --- ### **4. 自定义实时模板(Live Templates)** **适用场景**:快速插入高频使用的代码块 **配置步骤**: 1. 打开 `Settings` → `Editor` → `Live Templates` 2. 创建自定义模板(示例:生成带版本号的日志语句): ```java // 缩写:logv private static final Logger LOG = LoggerFactory.getLogger($CLASS_NAME$.class); // 变量 $CLASS_NAME$ 自动替换为当前类名 ``` --- ### **5. 资源文件变量(.properties / .yml)** **适用场景**:国际化或多环境配置 **示例**: 1. 在 `application.yml` 定义变量: ```yaml custom: maxRetry: 3 endpoint: https://api.example.com ``` 2. 通过 `@Value` 注入使用: ```java @Value("${custom.maxRetry}") private int maxRetry; ``` --- ### **变量优先级对比** | 变量类型 | 作用范围 | 实时更新 | 典型用途 | |------------------|----------------|----------|--------------------------| | 模板变量 | 文件创建时 | ❌ | 文件头注释、类初始值 | | 环境变量 | 运行时 | ✅ | 敏感数据、环境区分 | | 项目属性 | 整个构建过程 | ✅ | 版本号、依赖配置 | | 实时模板 | 代码编辑时 | ✅ | 代码片段快速生成 | | 资源文件变量 | 应用运行时 | ✅ | 多环境配置、业务参数 | --- ### **高级技巧:动态变量扩展** 在 `.vm` 模板文件中使用 Velocity 语法实现条件判断: ```java #if (${PROJECT_NAME.contains("demo")}) // 仅在 demo 项目中生成特殊逻辑 #end ``` 通过合理配置这些变量,可显著提升代码复用率和可维护性,同时降低硬编码风险。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值