zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Mifare系列3-卡的能源和数据传递(转)
    Mifare系列2-非接触卡标准(转)
    Mifare系列1-简介(转)
    oot 空间不足解决方法
    C语言位操作(转)
    C语言面试题(三)
    C语言运算符和优先级
    C语言面试题(二)
    C语言面试题(一)
    Ubuntu+Win7双系统grub的修复问题
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/11399101.html
Copyright © 2011-2022 走看看