2015-01-19 4 views
6

Я пытаюсь построить библиотеку. У меня есть проект библиотеки Android и некоторые ресурсы в каталоге res, который я хочу получить в коде проекта библиотеки. В Android Docs говорит:Доступ к ресурсам из проекта библиотеки Android?

исходный код в модуле библиотеки могут получить доступ к своим собственным ресурсам через R класса

Но я просто не могу понять, как это сделать. Поскольку это библиотека и предназначена для использования из других приложений, не запускайте ее самостоятельно, у меня нет Activity, поэтому я не могу получить Context для использования getResources(). Как я могу получить доступ к этим ресурсам явно без контекста?

+0

По библиотеке вы имеете в виду проект библиотеки или файл JAR/AAR? Вы можете получить доступ к ресурсам только из проектов библиотек или файлов AAR, а не файлов JAR. – shkschneider

+0

Проект библиотеки, а не файл JAR. – sqshemet

+0

Чтобы быть справедливым, я не получаю вашу установку приложения. У вас есть «нет активности» или «контекст»? Вы строите Android-приложение sir? – shkschneider

ответ

0

Без какой-либо деятельности не представляется возможным использовать класс 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; 
    } 
} 

(см https://stackoverflow.com/a/24972256/1765629 для получения дополнительной информации о ContextWrappers)

и конструктор объекта в библиотеке принимает, что контекст обертку,

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, все они живут внутри проекта библиотеки.

Надеюсь, это поможет.

Смежные вопросы