Как конвертировать Drawable в int и наоборот в Android
Я хочу, чтобы преобразовать Drawable на int и наоборот.В основном я хочу сохранить Arraylist объект sharedPrefrence. Для этого у меня есть реализация Gson к методу преобразования Srtring. Если я использую здесь Drawable вместо int затем преобразование строк Gson занимает много времени. поэтому я хочу использовать int вместо Drawable.
private List<AppInfo> apps = null;
public void setIcon(int icon) {
this.icon = icon;
}
apps.get(position).setIcon(mContext.getResources().getDrawable(apps.get(position).getIcon()));
где AppInfo здесь is
public AppInfo(String appname, String pname, String versionName, int versionCode, int icon, int color) {
this.appname = appname;
this.pname = pname;
this.versionName = versionName;
this.versionCode = versionCode;
this.icon = icon;
this.color = color;
}
вот источник преобразования ArrayList пользовательского объекта в строку, чтобы я мог сохранить его в SharedPrefrence.
Gson gson = new Gson();
apps.get(number).setColor(picker.getColor());
String JsonAppsdata = gson.toJson(apps);
System.out.println("Storing="+JsonAppsdata);
utility.StoreData(getApplicationContext(), JsonAppsdata);
2 ответов
Int - > Drawable:
Drawable icon = getResources().getDrawable(42, getTheme());
Drawable - > Int:
(я предполагаю, что вы заселяете List<AppInfo> apps
С приложением, чьи значки уже находятся в res/drawable
папка приложения)
как только вы установите свой R.drawable.app1
to ImageView
, вы также можете дать ему tag
чтобы определить ресурс в ImageView
позже:
ImageView appIcon1ImageView = (ImageView)findViewById(R.id.app_icon_1);
appIcon1ImageView.setImageDrawable(getDrawable(R.drawable.app1));
appIcon1ImageView.setTag(R.drawable.app1);
......
// Once you need to identify which resource is in ImageView
int drawableId = Integer.parseInt(appIcon1ImageView.getTag().toString());
если ваши значки поступают с сервера-единственный способ -сохранить их на диск, а затем повторно загрузить их. (или, лучше, полагаться на уже существующие решения кэширования изображений, такие как Пикассо)
UPD:
Нет прямого способа преобразования Drawable
на int
, но в этом конкретном случае можно получить int
, вместо Drawable
С PackageManager
:
ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(apps.get(position).getPname(),1);
int icon= applicationInfo.icon;
вот как мы можем получить значок приложения и установить его для imageview.
applicationInfo=mContext.getPackageManager().getApplicationInfo(apps.get(position).getPname(),PackageManager.GET_META_DATA);
int icon= applicationInfo.icon;
Rsources resources=mContext.getPackageManager().getResourcesForApplication(applicationInfo);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
holder.itemIcon.setImageDrawable(resources.getDrawable(icon,null));
}else
{
holder.itemIcon.setImageDrawable(resources.getDrawable(icon));
}