从Android库项目访问资源?

我正在尝试建立一个图书馆.我有一个 Android库项目和res目录下的一些资源,我想在库项目的代码中访问它. Android文档说:

source code in the library module can access its own resources through its R class

但我无法弄清楚如何做到这一点.因为它是一个库,打算从其他应用程序中使用,而不是自己运行,所以我没有Activity,所以我无法使用getResources()来获取Context.如何在没有上下文的情况下显式访问这些资源?

解决方法

没有Activity,似乎不可能使用R类.如果您的库中有测试应用程序,测试应用程序将能够访问R,但不能访问lib本身.

您仍然可以按名称访问资源.
例如,我的库中有一个这样的类,

public class MyContext extends ContextWrapper {
  public MyContext(Context base) {
    super(base);
  }

  public int getResourceId(String resourceName) {
    try{
        // I only access resources inside the "raw" folder
        int resId = getResources().getIdentifier(resourceName,"raw",getPackageName());
        return resId;
    } catch(Exception e){
        Log.e("MyContext","getResourceId: " + resourceName);
        e.printStackTrace();
    }
    return 0;
  }
}

(有关ContextWrappers的更多信息,请参阅https://stackoverflow.com/a/24972256/1765629)

并且库中对象的构造函数采用该上下文包装器,

public class MyLibClass {
  public MyLibClass(MyContext context) {
    int resId = context.getResourceId("a_file_inside_my_lib_res");
  }
}

然后,从使用lib的应用程序,我必须传递上下文,

public class MyActivity extends AppCompatActivity {
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    MyLibClass a = new MyLibClass(new MyContext(this));
  }
}

MyContext,MyLibClass和a_file_inside_my_lib_res,它们都存在于库项目中.

我希望它有所帮助.

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...