Je veux convertir Drawable en int puis inversement.En gros, je veux enregistrer Arraylist object dans sharedPrefrence . Pour cela, j'ai la méthode de conversion Implement Gson to Srtring. Si j'utilise ici Drawable au lieu de int alors la conversion en chaîne Gson prend beaucoup de temps. donc je veux utiliser int au lieu de 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()));
Où se trouve AppInfo
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;
}
Voici la source de la conversion de l'objet personnalisé ArrayList en chaîne afin que je puisse l'enregistrer dans 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);
Int -> Drawable:
Drawable icon = getResources().getDrawable(42, getTheme());
Drawable -> Int:
(Je suppose que vous remplissez List<AppInfo> apps
avec les applications dont les icônes sont déjà dans le dossier res/drawable
de votre application)
Une fois que vous avez défini votre R.drawable.app1
sur ImageView
, vous pouvez également lui attribuer une tag
pour identifier la ressource dans la ImageView
ultérieurement:
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());
Si vos icônes proviennent du serveur - le seul moyen est de les stocker sur le disque puis de les recharger. (ou mieux, utilisez les solutions de mise en cache d’images existantes telles que picasso )
UPD: Il n'y a pas de moyen direct de convertir Drawable
en int
, mais dans ce cas particulier, il est possible d'obtenir le int
au lieu de Drawable
à partir de PackageManager
:
ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(apps.get(position).getPname(),1);
int icon= applicationInfo.icon;
Voici comment nous pouvons aller chercher l’icône de l’application et la définir pour une 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));
}