引用系统资源 error: Error: Resource is not public.

Android资源使用与引用技巧
本文介绍了Android中如何有效利用系统资源,包括ID、字符串资源、样式、颜色定义及图片资源引用方法,并提供了实例和解决方案。

本文转自: http://www.cnblogs.com/vieboo/archive/2013/05/30/3108130.html


声明: 1)利用系统定义的id 

<ListView

    android:id="@android:id/list"

使用android.R.id.list来获取。

3)利用系统的字符串资源 @android:string/yes和@android:string/no,在简体中文环境下会显示“确定”和“取消”,在英文环境下会显示“OK”和“Cancel

 4)利用系统的Style

android:textAppearance="?android:attr/textAppearanceMedium"就是使用系统的style。需要注意的是,使用系统的style,需要在想要使用的资源前面加“?android:”作为前缀,而不是“@android:”。

5)利用系统的颜色定义

 android:background ="@android:color/transparent"

Android系统本身有很多资源在应用中都可以直接使用,具体的,可以进入android-sdk的相应文件夹中去查看。例如:可以进入$android-sdk$\platforms\android-8\data\res,里面的系统资源就一览无余了。

2)利用系统的图片资源

    假设我们在应用程序中定义了一个menu,xml文件如下。

<?xml version="1.0" encoding="utf-8"?>

<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item

        android:id="@+id/menu_attachment"

        android:title="附件"

        android:icon="@android:drawable/ic_menu_attachment" />

</menu>

 

其中代码片段android:icon="@android:drawable/ic_menu_attachment"本来是想引用系统中已有的Menu里的“附件”的图标。但是在Build工程以后,发现出现了错误。提示信息如下:

error: Error: Resource is not public. (at 'icon' with value '@android:drawable/ic_menu_attachment').

 

从错误的提示信息大概可以看出,由于该资源没有被公开,所以无法在我们的应用中直接引用。既然这样的话,我们就可以在Android SDK中找到相应的图片资源,直接拷贝到我们的工程目录中,然后使用类似android:icon="@drawable/ic_menu_attachment"的代码片段进行引用。

这样做的好处,一个是美工不需要重复的做一份已有的图片了,可以节约不少工时;另一个是能保证我们的应用程序的风格与系统一致。

 

经验分享:

Android中没有公开的资源,在xml中直接引用会报错。除了去找到对应资源并拷贝到我们自己的应用目录下使用以外,我们还可以将引用“@android”改成“@*android”解决。比如上面引用的附件图标,可以修改成下面的代码。

android:icon="@*android:drawable/ic_menu_attachment"

修改后,再次Build工程,就不会报错了。

<think>嗯,用户遇到了Android组件化开发中AAPT报错resource not found的问题。我需要先回想一下常见的资源冲突原因。首先,组件化中多个模块可能拥有相同的资源名称,比如相同的图片名字或布局文件名,这会导致AAPT在合并资源时冲突。另外,依赖管理不当也可能引起问题,比如不同模块引用了不同版本的库,导致资源ID不一致。 根据引用[3]和引用[4],使用不同的AssetManager加载资源或者hook系统方法可以解决资源冲突。但用户的问题更直接,是资源未找到,而不仅仅是冲突。可能的情况是资源没有正确引用,比如在子模块中引用了其他模块未公开的资源,或者资源路径配置错误。 接下来,解决方案方面,引用[1]提到在library的build.gradle中设置packageBuildConfig(false),这可能是因为BuildConfig类生成冲突。但用户的问题是关于资源未找到,可能需要检查资源命名空间。在Android Gradle插件4.0以后,可以开启namespace来避免资源冲突,确保每个模块有唯一的包名。 另外,资源可见性也很重要。如果主模块无法访问子模块的资源,可能需要检查子模块的资源配置是否正确,是否将需要共享的资源设置为public,或者使用api方式依赖库模块。引用[2]提到的资源路径配置,比如在sourceSets中正确指定资源目录,也可能相关。 还有AAPT选项,比如在build.gradle中设置resourcePrefix,强制模块资源添加前缀,避免重复。同时,清理和重建项目也是常见的解决缓存问题的方法。 需要一步步引导用户检查资源命名、模块依赖、namespace设置、资源可见性以及清理项目。可能还需要确保所有模块的包名唯一,资源引用正确使用R类全路径,比如com.example.module.R.string.res_name。</think>### Android组件化开发中AAPT资源未找到问题解决方案 #### 一、问题原因分析 资源未找到错误(AAPT: resource not found)通常由以下原因导致: 1. **资源命名冲突**:多个模块定义了相同名称的资源(如布局文件、字符串等),导致资源合并时覆盖或冲突[^3][^4] 2. **依赖配置错误**:模块间依赖关系未正确定义,主模块无法访问子模块资源 3. **命名空间未隔离**:未使用Android Gradle Plugin的namespace功能隔离模块资源 4. **资源可见性问题**:未正确配置资源访问权限(public/private) #### 二、具体解决步骤 1. **启用资源前缀(推荐)** 在子模块的`build.gradle`中添加: ```groovy android { resourcePrefix "module1_" // 强制添加模块名前缀 } ``` 这将自动为所有资源添加前缀(如`module1_btn_submit`),避免命名冲突[^4] 2. **配置命名空间隔离** ```groovy android { namespace 'com.example.module1' // Android Gradle Plugin 7.0+ 必须配置 } ``` 确保每个模块有唯一namespace,需与`AndroidManifest.xml`中的package一致 3. **正确声明模块依赖** 在主模块的`build.gradle`中使用`implementation`或`api`声明依赖: ```groovy dependencies { implementation project(':module1') implementation project(':module2') } ``` 4. **处理BuildConfig冲突** 在子模块中禁用BuildConfig生成: ```groovy android { packageBuildConfig false // 引用[1]解决方案 } ``` 5. **资源访问规范** 跨模块访问资源时使用全限定名: ```xml <string name="app_name">@string/module1_app_name</string> ``` #### 三、验证与调试技巧 1. 查看合并后的资源文件: ```shell ./gradlew :app:processDebugResources --debug ``` 2. 检查最终`build/intermediates/merged_res`目录下的资源合并结果 3. 使用Android Studio的`Resource Manager`工具可视化查看资源分布 #### 四、进阶优化方案 1. **动态资源加载**(适用于插件化场景): ```java AssetManager assetManager = AssetManager.class.newInstance(); Method addAssetPath = assetManager.getClass().getMethod("addAssetPath", String.class); addAssetPath.invoke(assetManager, apkPath); // 引用[3] ``` 2. **资源混淆**(减少资源体积同时避免冲突): ```groovy android { buildTypes { release { shrinkResources true minifyEnabled true } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值