Как конвертировать 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));

                    }