• Android 组件化之路 资源冲突问题


    比如我现在有3个模块:app模块,user模块,me模块,其中app模块依赖user模块和me模块。

    然后我在user模块和me模块的strings.xml中都定义了greet字符串:

    // user模块
    <resources>
    ...
    <string name="greet">Hello!</string>
    ...
    </resources>
    
    // me模块
    <resources>
    ...
    <string name="greet">Hi!</string>
    ...
    </resources>

    然后在app模块引用greet这个字符串:

    // app模块
    <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textSize="30dp"
    android:text="@string/greet"
    />

    那么问题来了,app模块引用的greet是user模块的呢,还是me模块的呢??这里出现资源冲突问题!!

    解决办法比较容易,每个子模块给资源名添加前缀,具体做法是在每个子模块的build.gradle文件的android块内添加一行代码:resourcePrefix “资源名前缀”:

    // me模块的build.gradle文件

    ...
    android {
    
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    
    resourcePrefix "me_"
    
    ...
    
    }
    ...
    // user模块的build.gradle文件
    ...
    android {
    
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    
    resourcePrefix "user_"
    
    ...
    
    }
    ...

    此时,你会发现,你定义的xml资源文件会报错!!为啥?

    我天真的以为AS会自动帮我们的资源名自动加上前缀,原来写了这段代码之后,AS会约束我们定义资源时,要我们手动加上前缀,否则报错!!所以只是起约束作用!!

    改正错误之后,资源文件变成这样了:

    // user模块
    <resources>
    ...
    <string name="user_greet">Hello!</string>
    ...
    </resources>
    
    // me模块
    <resources>
    ...
    <string name="me_greet">Hi!</string>
    ...
    </resources>

    这样app引用的时候,就不会混乱了!!

    如果你还知道其他方法,请不吝赐教!!
    ————————————————
    版权声明:本文为CSDN博主「JohanMan」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/JohanMan/article/details/77101477

  • 相关阅读:
    SpringBoot的缓存
    jsp标签指定id区域内容显示和隐藏
    Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)
    回文数
    算法z形字符串
    最长回文字符串
    redis与Mysql数据同步
    算法(1)
    滑动窗口算法
    HTTP长连接和短连接
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/11399101.html
Copyright © 2020-2023  润新知