如何从一个库项目中获取另一个项目内的资源

5
这里是情况说明:我有两个项目,一个是LibraryProject,另一个是MainProject。MainProject将LibraryProject作为库引用。LibraryProject中有一个活动需要检测MainProject是否定义了特定的drawable,比如说“logo.png”(想象一下每个MainProject都必须定义标志图片,而不是由LibraryProject定义)。在LibraryProject的一个活动中,如何检查MainProject是否在res/drawable文件夹中拥有这张图片?
显然,我已经尝试过R.drawable.logo != 0(或其变体),但正如你所知,这行代码无法编译,因为该图片不在LibraryProject的res/drawable文件夹中。
我还尝试使用getResources().getIdentifier("logo", "drawable", null) != 0,但这个布尔表达式总是返回false,因为.getIdentifier()总是返回零。
你有什么想法?
3个回答

7
你可以尝试这样做:(但请记住,上下文始终是“ChildProject”)
public static Drawable getDrawable(Context context, String resource_name){
    try{
        int resId = context.getResources().getIdentifier(resource_name, "drawable", context.getPackageName());
        if(resId != 0){
            return context.getResources().getDrawable(resId);
        }
    }catch(Exception e){
        Log.e(TAG,"getDrawable - resource_name: "+resource_name);
        e.printStackTrace();
    }

    return null;
}

谢谢!那个好用!我没有意识到上下文应该是来自于MainProject而不是LibraryProject。 - Renato Lochetti
我该如何从库项目中获取上下文? - Vijay
重要提示:必须初始化上下文才能执行此操作。 - jobbert

1
你需要在库项目中提供默认资源。如果在MainProject中有同名的资源,它将覆盖库项目资源。
例如,如果你在两个项目中都提供了"res/drawable/logo.png",那么库项目中的R.drawable.logo将使用MainProject中"res/drawable"文件夹中的"logo.png"图片。
这个回答没有解决图书馆项目如何发现主项目是否有资源的问题,只是解决了如果有资源就如何强制使用的方法。

我同意你的观点,但这正是我不想要的,因为如果主项目没有定义资源,那么库项目的资源将被显示出来,而我不希望出现这种情况。如果主项目没有提供我需要的资源,我想知道并采取其他措施。 - Renato Lochetti
也许@Dale的答案有一些希望。虽然需要进行一些实验,但如果我是你,我会选择这条路线。另一种方法是创建一个非常小的默认资源,并在应用程序中存储签名(例如字节大小),以便您可以测试是否找到了库项目的默认资源。否则,将存在一个主项目资源。 - David Manpearl

0
让您的主项目向库传递一个Context,并调用context.getString()。

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