HashMap <String, Drawable> mDrawables;

1

Я пытаюсь включить идентификатор drawable, чтобы проверить, уже ли он доступен в памяти, прежде чем снова загружать чертежи. Я извлекаю тему из пакета apk темы и извлекаю их по String, как показано в методе getDrawable. Для жизни меня я не могу понять, почему я получаю нулевой указатель на этой строке и почему это не работает.

"    if (!mDrawables.containsKey(name)) {"

Вот как я вызываю его для отображения изображений в своих действиях.

/* Custom theme */
        auxDrw = ThemeManager.getDrawable(ThemeID.FONDO);
        // Fondo
        if(auxDrw!=null)((LinearLayout)findViewById(R.id.about_layout)).setBackgroundDrawable(auxDrw);

Это ThemeManager:

        public static Resources themeResources = null;
            public static String themePackage = null;

            public static void setTheme(Context ctx, String themePack){
                PackageManager pm = ctx.getPackageManager();
                themePackage = themePack;
                themeResources = null;
                try{
                    themeResources = pm.getResourcesForApplication(themePackage);
                }catch(NameNotFoundException e){
                    Log.d("tag", "Theme not found: "+e.getMessage());
                }
            }

        public static void setTheme(Context ctx){
                String themePackageName = Utils.preferencias.getString("themePackageName", "");
                ThemeManager.setTheme(ctx, themePackageName);
            }


        private static boolean mActive = true;

            private static HashMap<String, Drawable> mDrawables;
            private Context ctx;


        public ThemeManager(Context c) {
                    mDrawables = new HashMap<String, Drawable>();
                    ctx = c;
                }

            public static Drawable getDrawable(String name) {
                if (mActive) {
                    if (!mDrawables.containsKey(name)) {
                        try {
                            int resource_id = themeResources.getIdentifier(name,
                                    "drawable", themePackage);
                            if (resource_id != 0) {
                                mDrawables.put(name,
                                        themeResources.getDrawable(resource_id));
                            }
                        } catch (NullPointerException e) {
                        }
                        return mDrawables.get(name);
                    }       
                }
                return null;
            }
Теги:
hashmap
drawable

1 ответ

1

Вы вызываете конструктор в ThemeManager в другом месте вашего кода? Похоже, вы пытаетесь реализовать статический одноэлементный класс, что-то в этом роде? Мне любопытно, какова большая картина здесь, пытаетесь ли вы загружать ресурсы по имени файла string вместо идентификатора ресурса?

  • 0
    Привет Сэм, Да, пытаясь загрузить их по имени строки, чтобы я мог передать эти параметры themeResources.getIdentifier (name, "drawable", themePackage); ID ресурса не позволит вам сделать это. Да, это статический одноэлементный класс для управления темами.
  • 0
    Я думал, что вы, возможно, пытаетесь достичь этого. Я бы порекомендовал вам заглянуть в AssetManager . Исходя из разработчика, который внедрил решение, используя отражение, чтобы обойти идентификаторы ресурса. Я честно думаю, что это лучшее решение. Я могу опубликовать пример кода, если вы хотите получить некоторые разъяснения.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню