Подтвердить что ты не робот

Как получить доступ к ресурсам, которые можно использовать, по имени в android

В моем приложении мне нужно получить некоторые растровые рисунки где-нибудь, где я не хочу сохранять ссылку R. Поэтому я создаю класс DrawableManager для управления чертежами.

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

Затем я хочу получить drawable по имени где-то вроде этого (car.png помещается внутри res/drawables):

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Вы можете сделать что-то вроде этого.

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

public class YourApplication extends Application {

    private static YourApplication instance;

    public YourApplication() {
        instance = this;
    }

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

И сопоставьте его в теге Manifest application

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

Ответ 3

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

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