2015-01-19 8 views
6

Ich versuche eine Bibliothek zu erstellen. Ich habe ein Android-Bibliotheksprojekt und einige Ressourcen unter dem Verzeichnis res, auf das ich im Code des Bibliotheksprojekts zugreifen möchte. Die Android-Dokumentation sagt:Zugriff auf Ressourcen von Android-Bibliotheksprojekt?

Quellcode im Bibliotheksmodul seine eigenen Ressourcen durch die R-Klasse zugreifen kann

Aber ich kann einfach nicht herausfinden, wie dies zu tun. Da es eine Bibliothek ist und von anderen Anwendungen verwendet werden soll, nicht selbst ausgeführt, habe ich keine Activity, so kann ich nicht ContextgetResources() verwenden. Wie kann ich explizit ohne Kontext auf diese Ressourcen zugreifen?

+0

Mit Bibliothek meinen Sie Bibliotheksprojekt oder JAR/AAR-Datei? Sie können nur von Bibliotheksprojekten oder AAR-Dateien auf Ressourcen zugreifen, nicht von JAR-Dateien. – shkschneider

+0

Bibliotheksprojekt, keine JAR-Datei. – sqshemet

+0

Um fair zu sein, bekomme ich nicht Ihre Anwendung Setup. Sie haben "keine Aktivität" oder "Kontext"? Bauen Sie eine Android-Anwendung Sir? – shkschneider

Antwort

0

Ohne eine Aktivität scheint es nicht möglich, die R-Klasse zu verwenden. Wenn Sie eine Testanwendung in Ihrer Bibliothek haben, kann die Testanwendung auf R zugreifen, jedoch nicht auf die Bibliothek selbst.

Noch können Sie auf die Ressourcen nach Name zugreifen. Zum Beispiel, ich habe eine Klasse wie diese in meiner Bibliothek,

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 finden Sie weitere Informationen über ContextWrappers)

Und den Konstruktor eines Objekts in der Bibliothek nimmt diesen Kontext Wrapper,

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

Dann aus der App, die die lib verwendet, muss ich den Kontext passieren,

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

MyContext, MyLibClass und a_file_inside_my_lib_res, alle leben im Bibliotheksprojekt.

Ich hoffe es hilft.