Je veux convertir Drawable en int , puis vice versa. Fondamentalement, je veux enregistrer l'objet Arraylist dans sharedPrefrence . Pour cela, j'ai implémenté la méthode de conversion Gson en Srtring. Si j'utilise ici Drawable au lieu de int , la conversion de 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 ArrayList de l'objet personnalisé 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);
8
M.ArslanKhan 27 déc. 2015 à 17:42

3 réponses

Meilleure réponse

Int - & gt; Dessiné:

Drawable icon = getResources().getDrawable(42, getTheme());

Dessiné - & gt; Int:

(Je suppose que vous remplissez List<AppInfo> apps avec des applications dont les icônes se trouvent 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 donner un tag pour identifier la ressource dans le ImageView plus tard:

    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 de les stocker sur le disque, puis de -chargez-les. (ou mieux, s'appuyer sur les solutions de mise en cache d'images déjà existantes comme 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 de PackageManager:

ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo(apps.get(position).getPname(),1);
int icon= applicationInfo.icon;
5
Community 23 mai 2017 à 12:17

C'est ainsi que nous pouvons récupérer l'icône de l'application et la définir pour une vue d'image.

                   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));

                    }
0
Lins Louis 30 nov. 2016 à 06:41

La seule solution qui a fonctionné pour moi était dans le chat par @KonstantinLoginov , mais au lieu d'utiliser:

val drawable = context.getPackageManager().getApplicationIcon(applicationInfo),

J'ai passé le packageName:

val drawable = context.getPackageManager().getApplicationIcon(packageName) qui est String et peut facilement être transmis.

0
waseefakhtar 13 mai 2020 à 11:41