当使用不同的包名时,file:///android_res/drawable无法工作。

12

我的问题是,当我向项目添加口味后,与实际源不同的包名的口味似乎存在访问android_res / drawable中文件的问题。

更具体地说,我有一个HTML视图调用以下图片。

<img src="file:///android_res/drawable/image.png">

这张图片出现在生产版本中,其包名与Java文件所在的目录相同,但对于测试版本则无法正常工作:

productFlavors {
    production {
        packageName "com.company.myapp"
    }

    beta {
        packageName "com.company.beta"
    }
}

Java文件实际所在的目录

java/com/company/myapp

这件事情相当奇怪,因为这些资源甚至不在那个文件夹里。


你找到解决方案了吗?我也在为同样的问题苦苦挣扎。 - Johan Levin
有人有解决这个问题的方法吗? - Frederico Silva
1
相同的问题。http://stackoverflow.com/questions/29876363/android-studio-project-flavors-resources - Michael Chourdakis
2个回答

4

Gradle不支持packageName。Gradle区分applicationId和packageName(请参见http://tools.android.com/tech-docs/new-build-system/applicationid-vs-packagename),这意味着您应该能够使资源包名称与应用程序的包标识符不同。

不幸的是,在webview中,file:///android_res URL方案似乎不支持此功能。

在我的情况下,我通过在其他包中创建一个具有正确内部类的R类,并使用从真实R文件中初始化的值初始化了一个公共静态final int字段来解决了这个问题。这是一种hack方法,不能在重命名资源时生存,并且如果您需要访问大量资源,则不方便。

因此,在您的情况下,这将看起来像是将此添加到beta flavor源文件目录中:

package com.company.beta;

class R
{
    class drawable
    {
        public static final int image = com.company.myapp.R.drawable.image;
    }
}

我之前放弃了这个项目,所以现在无法测试它。但如果有人开始点赞这个答案,我会将其标记为正确的 :) - vikeri
这真是个hack,但它可用!点赞。太糟糕了,你必须与框架作斗争! - alphonzo79
非常肮脏但可行。谢谢分享! - Kirill Starostin

1

更新答案

你是否正确设置了你的口味文件夹?

如果你有两个口味(flavorOne, flavorTwo),你需要相应地设置源文件夹。

你的build.gradle文件应该类似于这样:

productFlavors {
        flavorOne {
            applicationId "com.package.name"
            versionCode 1
            versionName "1.0"
        }
        flavorTwo {
            applicationId "com.package.name.two"
            versionCode 1
            versionName "1.0"
        }
}

因此,对于这两种版本,文件夹结构如下所示:

src
---|main
--------|java
-------------|com.package.name
--------|res
-------------|drawable

---|flavorOne
--------|java
-------------|com.package.name
--------|res
-------------|drawable

---|flavorTwo
--------|java
-------------|com.package.name
--------|res
-------------|drawable

将每种风味的可绘制文件放在其关联的文件夹中。 因此,flavorOneimage.png 文件应该放在该可绘制文件夹中,flavorTwoimage.png 文件应该放在 flavorTwo 可绘制文件夹中。
这样本地化就可以适用于每个风味。
您不应该创建“R”类。这些是自动生成的。 旧回答 并非完全解决您的问题,但另一种方法是。
您可以将图像文件移动到资产文件夹中,然后使用此方法。
<img src="file:///android_asset/image.png">

只有在您不关心所引用的项目的本地化(使用资源文件可以实现)时,才是可行的选择。 - user486646

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接