2010-01-25 6 views
13

Ich habe einige benutzerdefinierte Klasse BitmapStorage, nicht an irgendeine Ansicht oder was auch immer - ein Dienstprogramm ein. Und ich habe born_animation.xml Datei, die < Animation-Liste > mit Animations-Frames enthält:Wie man AnimationDrawable aus der XML-Datei lädt

<animation-list oneshot="true" > 
    <item drawable="@drawable/frame01" /> 
    <item drawable="@drawable/frame02" /> 
</animation-list> 

Ich Animation aus XML-Datei als AnimationDrawable Ressourcen zu ladende Klasse verwenden (so wäre es für mich all das Parsen tun), extrahiere Bitmaps und lege sie in meine benutzerdefinierte Storage-Klasse.

Das Problem, das ich habe:

Resources res = context.getResources(); 
AnimationDrawable drawable = (AnimationDrawable)res.getDrawable(R.drawable.born_animation); 
assertTrue(drawable != null); <= fails! it's null 

WTF? Kann mir das jemand erklären? Code kompiliert gut. Alle Ressourcen sind vorhanden.

habe ich versucht, einen anderen Weg - Image verwenden die Parsen zu tun (wie in dev Handbuch beschrieben)

Ergebnisse sind die gleichen. Es gibt das null-Zeichen zurück.

Alle Hintern würde sehr geschätzt werden, danke im Voraus.

+0

nicht als Hintergrund festlegen - siehe Beispiel unten. –

Antwort

6

Yay, ich die Ursache gefunden! :)

Es war meine schlechte: Ich habe das richtige Format meiner animation.xml Datei nicht hatte:

  • Ich habe nicht Android verwenden: namespace in Attribute (aus irgendeinem Grund habe ich beschlossen, es ist nicht required)
  • ich löschte "Dauer" -Attribut in <Artikel> Tags

Nachdem ich diese Dinge res.getDrawable() fixiert begann eine korrekte AnimationDrawable Instanz zurückzukehren.

Hatte genauer an Resources.NotFoundException schauen und es ist getCause(), um herauszufinden, was los ist :)

26

Drawable

<animation-list xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/myprogress" 
       android:oneshot="false"> 
    <item android:drawable="@drawable/progress1" android:duration="150" /> 
    <item android:drawable="@drawable/progress2" android:duration="150" /> 
    <item android:drawable="@drawable/progress3" android:duration="150" /> 
</animation-list> 

Code:

ImageView progress = (ImageView)findViewById(R.id.progress_bar); 
if (progress != null) { 
    progress.setVisibility(View.VISIBLE); 
    AnimationDrawable frameAnimation = (AnimationDrawable)progress.getDrawable(); 
    frameAnimation.setCallback(progress); 
    frameAnimation.setVisible(true, true); 
} 

Ansicht

<ImageView 
    android:id="@+id/progress_bar" 
    android:layout_alignParentRight="true" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/myprogress" /> 
+0

Hmm. Danke, aber das ist meistens der Code aus dem Dev-Guide - das will ich nicht. Das Erstellen von ImageView ist etwas, was ich nicht brauche - ich habe das als Workaround versucht. Ich werde es nirgendwo anzeigen. Wie kann ich das ohne ImageView machen? Warum funktioniert die erste Variante (mit res.getDrawable()) nicht? – dimsuz

+1

Auch ich kann View.findViewById nicht verwenden, weil ich keine Ansicht habe - wie ich sagte, das ist eine Dienstprogrammklasse. Stellen Sie sich vor, ich habe eine Bibliothek, die nichts über View/Activity weiß. Kann es dann keine Ressourcen laden?:) – dimsuz

+0

herum, um die Aktivität zu beenden, wenn sie fertig ist? – RobinHood

3

Dies verwendet werden könnten Mittel aus dem „xml“ Verzeichnis zu laden.

Drawable myDrawable; 
Resources res = getResources(); 
try { 
    myDrawable = Drawable.createFromXml(res, res.getXml(R.xml.my_drawable)); 
} catch (Exception ex) { 
    Log.e("Error", "Exception loading drawable"); 
}