2015-09-15 7 views
5

Ich versuche VectorDrawables in meiner Android App zu verwenden.
Ich möchte eine XML-Datei aus dem Dateisystem laden und eine Instanz von android.graphics.Drawable erhalten, um es in einem ImageView anzuzeigen. Wenn ich die XML-Datei zum Ressourcenverzeichnis hinzufüge, funktioniert es. Aber wenn ich versuche, es aus dem Dateisystem zu laden, bekomme ich immer einen NullPointer.Ist es möglich, ein VectorDrawable aus dem Dateisystem (* .xml Datei) zu erstellen

Ich versuche gerade, die Datei über Drawable.createFromPath(*Path to File*) oder VectorDrawable.createFromPath(*Path to File*) zu laden, aber ich bekomme immer einen NullPointer. Die Datei existiert und ist eine gültige XML-Datei (siehe unten).

In adb log ich erhalte immer:

SkImageDecoder::Factory returned null 

Wenn ich mContext.getFilesDir() der Pfad sieht aus wie

etwas verwenden
/data/data/*packagename*/files/*filename*.xml 

Ich habe versucht, auch einige öffentliche Ordner wie "Downloads". Wenn ich die Datei mit dem File.io Api überprüfen exists() es, canRead() und canWrite()

aktualisieren Die Übersicht zeigt die XML-Code aus dem Android Dev Seiten genommen

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
android:height="64dp" 
android:width="64dp" 
android:viewportHeight="600" 
android:viewportWidth="600" > 
<group 
    android:name="rotationGroup" 
    android:pivotX="300.0" 
    android:pivotY="300.0" 
    android:rotation="45.0" > 
    <path 
     android:name="v" 
     android:fillColor="#000000" 
     android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" /> 
</group> 

+0

Können Sie den Code Ihrer XML-Datei posten? – Kmeixner

Antwort

3

Leider nicht. Es sei denn, Sie kompilieren die XML-Quelldatei irgendwie so, wie Ressourcen kompiliert werden. VectorDrawable geht derzeit von einer kompilierten Bildquelle aus.

Sonst könnte man wohl geschrieben hat, so etwas wie diese:

VectorDrawable d = new VectorDrawable(); 
try(InputStream in = new FileInputStream(*Path to File*);) 
{ 
    XmlPullParser p = Xml.newPullParser(); 
    p.setInput(in, /*encoding, self detect*/null); 
    d.inflate(getResources(), p, Xml.asAttributeSet(p)); // FAILS 
} 

Derzeit, die (API-Ebene 23, Eibisch 6.0), weil das aufblasen Aufruf fehlschlägt versucht, das Attribut zu werfen auf ein XmlBlock.Parser, der eine wirft ClassCastException. Die Ursache ist in der source dokumentiert; Es wird "nur mit kompilierten XML-Dateien arbeiten", wie Ressourcen, die von dem Tool aapt verpackt werden.

+1

Eine Anfrage dazu wurde hinzugefügt: https://issuetracker.google.com/issues/62435069 –

0

Eigentlich können Sie ja, und ich habe es in meinen eigenen Projekten getan.

Wie in der vorherigen Antwort erwähnt, brauchen Sie in der Tat die kompilierte Version des XML-Zeichensatzes statt der, die Sie beispielsweise von Android Studio erhalten. AFAIK unterstützt die VectorDrawable-API das Laden von Roh-XML noch nicht.

Um dies zu tun, legen Sie einfach Ihre Bilder vorübergehend unter dem Verzeichnis res, so dass sie als normale Ressourcen während des Build-Prozesses kompiliert werden, dann finden Sie Ihre generierte APK und extrahieren sie von dort (Sie werden feststellen, dass sie nicht mehr sind) Textdateien, aber Binärdateien). setzen sie jetzt wieder, wo Sie unter Ihr Vermögen dir wollen und verwenden Code ähnlich wie diese sie als Drawables zu laden:

XmlResourceParser parser = context.getAssets() 
    .openXmlResourceParser("assets/folder/image.xml"); 
drawable = VectorDrawableCompat.createFromXml(context.getResources(), parser); 

Hinweis das Vermögen/'Teil des Pfades. Das ist erforderlich, afaik.

+0

Gibt es eine Möglichkeit, die Dateien aus den normalen XML-Dateien zu laden, wie wir sie in der IDE sehen? –

Verwandte Themen