tags:

views:

867

answers:

2

Heya guys!

I have some custom class BitmapStorage, not attached to any View or whatever - an utility one. And I have born_animation.xml file which contains <animation-list> with animation frames:

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

I want to load animation from xml file as an AnimationDrawable using Resources class (so it would do all the parsing for me), extract Bitmaps and put them to my custom storage class.

The problem i have:

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

WTF? Can someone explain me that? Code compiles fine. All resources are in place.

I tried another way - use ImageView to do the parsing (like described in dev guide)

ImageView view = new ImageView(context); 
view.setBackgroundResource(R.drawable.born_animation); 
AnimationDrawable drawable = (AnimationDrawable)view.getBackground(); 
assertTrue( drawable != null ); <= fails! it's null 

Results are the same. it returns the null drawable.

Any hinsts would be greatly appreciated, thanks in advance.

+2  A: 

Drawable

  <animation-list   android:id="@+id/myprogress" android:oneshot="false" 
         xmlns:android="http://schemas.android.com/apk/res/android"&gt;
        <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);
    }

View

<ImageView
  android:id="@+id/progress_bar"
  android:layout_alignParentRight="true"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:src="@drawable/myprogress" />
Alex Volovoy
Hmm. Thanks, but this is mostly the code from the dev guide - this is not what I want. Actually creating ImageView is something that I don't need - i tried that as a workaround. I won't display it anywhere.How can I do that without ImageView? Why does the first variant I tried (with res.getDrawable()) fail to work?
dpimka
Also I can't use View.findViewById, because I have no View - as i said this is an utility class.Imagine I have a library which knows nothing about View/Activity. Can't it load resources then? :)
dpimka
A: 

Yay, I found the cause! :)

It was my bad: I didn't had the proper format of my animation.xml file:

  • I didn't use android: namespace in attributes (for some reason i decided it's not required)
  • I deleted "duration" attribute in <item> tags

After I fixed these things res.getDrawable() started to return a correct AnimationDrawable instance.

Had to look more precisely at Resources.NotFoundException and it's getCause() to find out what's wrong :)

dpimka