从Android库项目访问资源?

时间:2015-01-19 16:01:59

标签: android resources libraries

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

  

库模块中的源代码可以通过其R类访问自己的资源

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

1 个答案:

答案 0 :(得分:0)

如果没有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,它们都存在于库项目中。

我希望它有所帮助。