如何在首选项中存储图像资源/名称

Posted

技术标签:

【中文标题】如何在首选项中存储图像资源/名称【英文标题】:How to store Image Resource/Name in preferences 【发布时间】:2015-02-09 16:18:06 【问题描述】:

我有一个场景:

假设有两个图像one.pngtwo.png。用户必须选择一张图片,我必须在 preferences 中保存 图片的名称Resource ID。稍后当用户打开应用程序时,我将加载用户上次选择的图像。

所以我的问题是如何将其保存在首选项中?为图像保存资源 ID 是否正确?安装应用程序后,R.java 内容是否保持不变?我只是不想将位图保存在任何地方,因为它已经存在于可绘制对象中。

请帮我弄清楚我的概念。谢谢。

【问题讨论】:

你不能只保存名字吗? "安装应用后,R.java 的内容是否保持不变?"它的内容在编译为 APK 后不会改变。但是,分配给每个变量的整数 ID 可能会在您将来修改代码以创建新 APK 时发生变化,因此不应该存储整数 ID。 @Kai 感谢您提供信息。我希望我能给你 +1 :) @iAnum 很高兴我能帮上忙:P 【参考方案1】:

我只想保存上次显示的图像的提示。我会使用“img1”和“img2”之类的东西。然后下次在 onCreate 加载正确的图像。一般来说,保存资源 id 应该可以正常工作,但如果您添加和删除新图像,​​则 id 可能会更改。但是,这只能在更新后发生。

在您的 onCreate 方法中尝试此代码:

SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID + "_preferences", Context.MODE_PRIVATE);
String lastImg = settings.getString("image");
if("img1".equals(lastImg) 
    imageView.setDrawable(R.drawable.img1);
 else if("img2".equals(lastImg) 
    imageView.setDrawable(R.drawable.img2);

【讨论】:

感谢您的回答。但这会使我的应用处理起来非常复杂,因为它有大量的图像。【参考方案2】:

做这样的事情:

public List<Integer> myImagesList;

public void createMyImagesList
    //Here put all the image ids you need into the list
    myImagesList.put(R.id.one);
    myImagesList.put(R.id.two);
 

以后,当您要存储用户选择时,只需存储所选图像的列表位置即可。

public Integer obtainUserSelectedImage(int theIdStoredInPrefs)
    return myImageList.get(theIdStoredInPrefs);

通过这种方式,您可以创建一个独立于 R.drawable id 的包装器 id,因为每次重新运行应用程序(并且可能重新构建)时,列表都会重新填充有效的 id。

【讨论】:

感谢您的回答,但这不适合我的情况。【参考方案3】:

您应该保存名称,即(在您的情况下为一,二)

稍后,您可以通过名称获取资源的 ID

String imageNameFromPreferences= getLastUsedImageFromPref();
//get resource id by name
final int resourceIdOfLastUsedImage = resources.getIdentifier(imageNameFromPreferences, "drawable", 
   context.getPackageName());
//use this id to set the image anywhere
imageView.setBackgroundResource(resourceIdOfLastUsedImage)

【讨论】:

确定 id 在更新时永远不会改变?我不确定。 每次应用编译时都会改变。这就是为什么我们每次运行应用程序时都使用固定的字符串标识符来检索动态生成的 id。 谢谢。这是我一直在寻找的技术。

以上是关于如何在首选项中存储图像资源/名称的主要内容,如果未能解决你的问题,请参考以下文章

在首选项设置中膨胀布局

如何保存和获取存储在共享首选项中的包名称?

在首选项文件中只保存一个值 - libgdx

如何以共享首选项保存图像?

如何使得matlab的计算结果默认显示为小数

LateInitializationError:字段“显示名称”尚未在 Flutter 共享首选项中初始化?