2013-05-04 4 views
44

В моем приложении мне нужно получить некоторые растровые рисунки где-нибудь, где я не хочу сохранять ссылку R. Поэтому я создаю класс DrawableManager для управления чертежами.Как получить доступ к ресурсам по названию в 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.? 
    } 
} 

Тогда я хочу, чтобы получить вытяжку по имени где-то, как это (car.png помещаются внутри рес/вводимого коэффициента):

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

Однако, как вы можете видеть, я не могу доступ ресурсы по названию:

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

Любые альтернативы?

ответ

109

Обратите внимание, что ваш подход - это почти всегда неправильный способ сделать что-то (лучше передать контекст самому объекту, который использует растягиваемое, нежели статическое Context).

Учитывая, что, если вы хотите сделать динамическую загрузку вытяжке, вы можете использовать getIdentifier:

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

'лучше передать контекст в самом объект, который использует вытяжку, чем держать статический контекст somewhere' Привет, Вы можете сказать мне больше? – hguser

+1

@hguser - причина, по которой вы хотите, чтобы «Drawable» отображал ее на экране - каждый объект/объект/фрагмент имеет связанный с ним «Context» - передает этот «Context» в ваш метод «getDrawable». – ianhanniballake

+0

Спасибо, я понял. – hguser

20

Вы могли бы сделать что-то вроде 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); 
} 

Для того, чтобы получить доступ к контексту из в любом месте, вы можете расширить Application class.-

public class YourApplication extends Application { 

    private static YourApplication instance; 

    public YourApplication() { 
     instance = this; 
    } 

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

И сопоставьте его в своем Manifestapplication тег

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

Спасибо, я никогда не знаю, что я могу получить контекст таким образом раньше. Похоже, что это сделает коды более чистыми. – hguser

+0

Получение «Контекста» таким образом, а не передача его, плохо для проверки. Например, чтобы протестировать любой метод, который вызывает 'YourApplication.getContext()', тест должен был бы инициализировать 'YouApplication' сначала, чтобы' YourApplication.getContext() 'не возвращать null. Создание глобалов в форме статики - это, как правило, плохая практика. – spaaarky21

4

содержание изображения Изменить:

ImageView image = (ImageView)view.findViewById(R.id.imagenElement); 
    int resourceImage = activity.getResources().getIdentifier(element.getImageName(), "drawable", activity.getPackageName()); 
    image.setImageResource(resourceImage); 
Смежные вопросы