Jamie
Jamie

Reputation: 683

Is it possible to load a drawable from the assets folder?

Can you load a drawable from a sub directory in the assets (not the drawable folder) folder?

Upvotes: 46

Views: 33126

Answers (8)

DarkPh03n1X
DarkPh03n1X

Reputation: 680

I was working in a RecyclerView adapter and found that David's answer was not working for me, (for some reason asset.open remained Unresolved no matter what I imported )

so I found this to work for me (Kotlin code)

val d = Drawable.createFromStream(context?.assets?.open("imageData/${imageName}.png"), null)

here is my directory, as you can see the assets start from the assets folder and here is a link on how to create that assets folder

enter image description here

Upvotes: 1

Bart Burg
Bart Burg

Reputation: 4924

Here's a class with static method to get the drawable from the assets. It also closes the inputstream.

import android.content.Context;
import android.graphics.drawable.Drawable;

import java.io.IOException;
import java.io.InputStream;

/**
 * Created by bartburg on 4-11-2015.
 */
public class AssetsReader {

    public static Drawable getDrawableFromAssets(Context context, String url){
        Drawable drawable = null;
        InputStream inputStream = null;
        try {
            inputStream = context.getAssets().open(url);
            drawable = Drawable.createFromStream(inputStream, null);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return drawable;
    }
}

Upvotes: 7

Sam J
Sam J

Reputation: 21

Here is function that does this for you.

Check the returned Drawable variable for null as null may return if the path is invalid or there is an IOException.

public static Drawable getDrawableFromAssetFolder(String fullPath, Activity ctx) {
    Drawable d =null;
    try {
        d = Drawable.createFromStream(ctx.getAssets().open(fullPath), null);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return d;
}

Upvotes: 2

richy
richy

Reputation: 2815

This helped getting the right density

private Drawable drawableFromAssetFilename(String filename) {
    AssetManager assetManager = mApplicationContext.getAssets();
    InputStream inputStream = null;
    try {
        inputStream = assetManager.open(filename);
    } catch (IOException e) {
        e.printStackTrace();
    }
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);

    BitmapDrawable drawable = new BitmapDrawable(mApplicationContext.getResources(), bitmap);
    return drawable;
}

Upvotes: 0

David
David

Reputation: 1520

I recommend to use this

 Drawable.createFromResourceStream(resources,new TypedValue(), resources.getAssets().open(filename), null)

which returns properly scaled drawable thanks to resources ...

Upvotes: 8

Rubycon
Rubycon

Reputation: 18346

Hope this help:

Drawable d = Drawable.createFromStream(getAssets().open("Cloths/btn_no.png"), null);

Upvotes: 107

Octavian Helm
Octavian Helm

Reputation: 39605

Yes you can create a Drawable object from an InputStream using the createFromStream() method.

Upvotes: 2

SterAllures
SterAllures

Reputation: 133

At this version you can't, if you make a sub folder within your drawable folder you can't use it in your xml file, it won't be recognized when you use android:src.

Take a look at this thread: Can the Android drawable directory contain subdirectories?

Upvotes: -1

Related Questions