2013-05-04 15 views
44

W mojej aplikacji, potrzebuję uzyskać niektóre rysunki bitmapowe gdzieś, gdzie nie chcę zachować odniesienia R. Dlatego tworzę klasę DrawableManager, aby móc zarządzać projektami.jak uzyskać dostęp do zasobów do rysowania według nazwy w Androidzie

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.? 
    } 
} 

Następnie chcę uzyskać rozciągliwej według nazwy gdzieś tak (The car.png jest umieszczany wewnątrz RES/kanału alfa):

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

Jednak jak widać, nie mają dostępu zasoby o nazwie:

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

Jakieś alternatywy?

Odpowiedz

109

Należy zauważyć, że twoje podejście jest prawie zawsze złym sposobem robienia rzeczy (lepiej przekazać kontekst do samego obiektu, który korzysta z losowania niż utrzymywać gdzieś miejsce statyczne Context).

Biorąc pod uwagę, że jeśli chcesz zrobić dynamiczną rozciągliwej załadunek, można użyć getIdentifier:

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

'lepiej przekazać kontekst do samego obiektu, który jest z wykorzystaniem rozciągliwej niż utrzymywanie statycznego Kontekst somewhere' Cześć, możesz mi powiedzieć więcej? – hguser

+1

@hguser - powód, dla którego chciałbyś, aby 'Drawable' wyświetlał go na ekranie - każdy widok/aktywność/fragment ma powiązany" Kontekst "- przekaż' Context' do metody 'getDrawable'. – ianhanniballake

+0

Dzięki, mam to. – hguser

20

Można zrobić coś jak 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); 
} 

W celu uzyskania dostępu z kontekstu w dowolnym miejscu, możesz rozszerzyć klasę Aplikacji. -

public class YourApplication extends Application { 

    private static YourApplication instance; 

    public YourApplication() { 
     instance = this; 
    } 

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

I zmapuj ją w swoim Manifestapplication tag

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

Dziękuję, nigdy nie wiem, że mogę uzyskać kontekst w ten sposób wcześniej. Wydaje się, że sprawi to, że kody będą czystsze. – hguser

+0

Uzyskanie "Kontekstu" w ten sposób, a nie przekazanie go, jest szkodliwe dla testowalności. Na przykład, aby przetestować dowolną metodę, która nazywa 'YourApplication.getContext()', test musiałby najpierw utworzyć instancję 'YouApplication', aby' YourApplication.getContext() 'nie zwracało wartości null. Tworzenie globów w postaci statyki jest ogólnie złą praktyką. – spaaarky21

4

Zmienić treść obrazu:

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