2015-01-19 80 views
6

Próbuję zbudować bibliotekę. Mam projekt biblioteki Androida i niektóre zasoby w katalogu res, do których chcę uzyskać dostęp w kodzie projektu bibliotecznego. Android docs mówi:Dostęp do zasobów z projektu biblioteki Android?

kod źródłowy modułu biblioteki mogą uzyskać dostęp do własnych zasobów za pośrednictwem swojej klasie R

Ale ja po prostu nie może dowiedzieć się, jak to zrobić. Ponieważ jest to biblioteka i ma być używana z innych aplikacji, nie uruchamia się sama, nie mam Activity, więc nie mogę uzyskać Context, aby użyć getResources(). Jak uzyskać bezpośredni dostęp do tych zasobów bez kontekstu?

+0

Według biblioteki masz na myśli projekt biblioteki lub plik JAR/AAR? Dostęp do zasobów można uzyskać tylko z projektów bibliotecznych lub plików AAR, a nie z plików JAR. – shkschneider

+0

Projekt biblioteki, a nie plik JAR. – sqshemet

+0

Szczerze mówiąc, nie otrzymuję konfiguracji aplikacji. Masz "brak aktywności" ani "kontekst"? Czy tworzysz aplikację dla Androida? – shkschneider

Odpowiedz

0

Bez działania nie wydaje się możliwe użycie klasy R. Jeśli masz aplikację testową w swojej bibliotece, aplikacja testowa będzie mogła uzyskać dostęp do R, ale nie z samej biblioteki.

Nadal można uzyskać dostęp do zasobów według nazwy. Na przykład, mam klasy jak ten w mojej bibliotece,

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; 
    } 
} 

(Zobacz https://stackoverflow.com/a/24972256/1765629 uzyskać więcej informacji na temat ContextWrappers)

a konstruktora obiektu w bibliotece trwa to opakowanie kontekstowe

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

Następnie z aplikacją, która wykorzystuje lib, trzeba przejść kontekstu

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

MyContext, MyLibClass i a_file_inside_my_lib_res, wszystkie one żyją wewnątrz projektu biblioteki.

Mam nadzieję, że to pomaga.