2011-02-03 2 views

Répondre

97

Hope this aide:

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

Je me demande simplement si le fichier est automatiquement fermé pour vous? Par sécurité, je donne actuellement une variable au retour de open(), puis je le ferme manuellement. –

+0

@DatVM non il ne ferme pas automatiquement le flux d'entrée. J'ai créé une classe avec une méthode statique pour obtenir le drawable des actifs et l'ai ajouté comme réponse séparée ci-dessous. –

-1

Dans cette version, vous ne pouvez pas, si vous créez un sous-dossier dans votre dossier drawable, vous ne pouvez pas l'utiliser dans votre fichier xml, il ne sera pas reconnu lorsque vous utilisez android: src.

Jetez un oeil à ce fil: Can the Android drawable directory contain subdirectories?

+0

Dans ce cas, quel est le moyen le plus simple de charger quelques centaines de tuiles de carte personnalisées à afficher à l'écran? – Jamie

+0

Ah ma question concerne le dossier des assets, pas le drawable. Question éditée. – Jamie

+0

Cette réponse est dépassée maintenant que la question a été mise à jour. – styler1972

2

Oui, vous pouvez créer un objet à partir d'un DrawableInputStream en utilisant la méthode createFromStream().

+0

est-il possible pour drawables dans le dossier drawable aussi? Si oui que comment? –

+0

@chiragshah Je ne comprends pas. Les images du répertoire drawable sont converties par le système pour vous. –

+0

J'ai besoin d'un moyen rapide de charger des images à partir du dossier des biens car j'ai beaucoup de tuiles de carte avec les mêmes noms mais des répertoires différents. – Jamie

5

Je recommande d'utiliser cette

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

qui retourne correctement mis à l'échelle étirables grâce aux ressources ...

+0

warrning: cette méthode cause une exception sur HTC Desire HD, ne me demandez pas pourquoi ... – David

0

Cela a permis d'obtenir la bonne densité

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; 
} 
1

Voici la fonction qui fait cela pour vous.

Vérifiez que la variable Drawable renvoyée pour la valeur null peut être renvoyée si le chemin n'est pas valide ou s'il existe une exception 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; 
} 
2

Voici une classe avec une méthode statique pour obtenir l'extractible des actifs. Il ferme également l'inputtream.

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; 
    } 
} 
Questions connexes