Я пытаюсь включить идентификатор 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;
}
Вы вызываете конструктор в ThemeManager
в другом месте вашего кода? Похоже, вы пытаетесь реализовать статический одноэлементный класс, что-то в этом роде? Мне любопытно, какова большая картина здесь, пытаетесь ли вы загружать ресурсы по имени файла string вместо идентификатора ресурса?
AssetManager
. Исходя из разработчика, который внедрил решение, используя отражение, чтобы обойти идентификаторы ресурса. Я честно думаю, что это лучшее решение. Я могу опубликовать пример кода, если вы хотите получить некоторые разъяснения.