2013-05-04 5 views
44

Nella mia applicazione, ho bisogno di ottenere alcuni drawable bitmap da qualche parte dove non voglio mantenere il riferimento R. Quindi creo una classe DrawableManager per gestire i drawable.come accedere alle risorse estraibili per nome in android

public class DrawableManager { 
    private static Context context = null; 

    public static void init(Context c) { 
     context = c; 
    } 

    public static Drawable getDrawable(String name) { 
     return R.drawable.? 
    } 
} 

Poi voglio ottenere il drawable per nome un posto come questo (il car.png viene messo all'interno della res/drawable):

Drawable d= DrawableManager.getDrawable("car.png"); 

Tuttavia, come potete vedere, non posso accedere le risorse con il nome:

public static Drawable getDrawable(String name) { 
    return R.drawable.? 
} 

Qualche alternativa?

risposta

109

Nota che il tuo approccio è quasi sempre il modo sbagliato di fare le cose (meglio passare il contesto nell'oggetto stesso che usa il drawable piuttosto che mantenere una statica Context da qualche parte).

dato che, se si vuole fare il caricamento dinamico drawable, è possibile utilizzare getIdentifier:

Resources resources = context.getResources(); 
final int resourceId = resources.getIdentifier(name, "drawable", 
    context.getPackageName()); 
return resources.getDrawable(resourceId); 
+1

'meglio per passare il contesto in oggetto stesso che utilizza il drawable che mantenere un contesto statico somewhere' Ciao, mi puoi dire di più? – hguser

+1

@hguser - il motivo per cui vuoi un 'Disegnabile' è visualizzarlo sullo schermo - ogni vista/attività/frammento ha un' Contesto' associato ad esso - passa quel 'Contesto' nel tuo metodo' getDrawable'. – ianhanniballake

+0

Grazie, ho capito. – hguser

20

Si potrebbe fare qualcosa di simile this.-

public static Drawable getDrawable(String name) { 
    Context context = YourApplication.getContext(); 
    int resourceId = context.getResources().getIdentifier(name, "drawable", YourApplication.getContext().getPackageName()); 
    return context.getResources().getDrawable(resourceId); 
} 

Al fine di accedere al contesto da ovunque, puoi estendere la classe di applicazione.-

public class YourApplication extends Application { 

    private static YourApplication instance; 

    public YourApplication() { 
     instance = this; 
    } 

    public static Context getContext() { 
     return instance; 
    } 
} 

E mapparlo nel tuo Manifestapplication tag

<application 
    android:name=".YourApplication" 
    .... 
+3

Grazie, non so mai che posso ottenere il contesto in questo modo prima. Sembra che renderà i codici più puliti. – hguser

+0

Ottenere un 'Contesto' in questo modo, piuttosto che passarlo, è dannoso per la testabilità. Ad esempio, per testare qualsiasi metodo che chiama 'YourApplication.getContext()', il test dovrebbe prima istanziare 'YouApplication' affinché' YourApplication.getContext() 'non restituisca null. La creazione di globals sotto forma di statica è in generale una cattiva pratica. – spaaarky21

4

Modifica contenuto dell'immagine:

ImageView image = (ImageView)view.findViewById(R.id.imagenElement); 
    int resourceImage = activity.getResources().getIdentifier(element.getImageName(), "drawable", activity.getPackageName()); 
    image.setImageResource(resourceImage);