Android 在共享优先级中保存R ID

Android 在共享优先级中保存R ID,android,sharedpreferences,identifier,r.java-file,Android,Sharedpreferences,Identifier,R.java File,我目前正在android中使用shared prefs来保存一些设置。这很有效,但我遇到了一个小问题。 在我的共享prefs中,我还保存了一些图像资源ID,以便稍后(在应用程序被销毁后)在新的应用程序启动时访问它们。 现在很明显,一旦我将新资源添加到我的资源树并再次构建应用程序(又名更新),ID就会改变,我将使用以前保存的ID访问不同的资源 您是否有一个想法/方法来保存图像资源ID(或任何其他标识符),而不丢失与它们的链接 非常感谢您。您可以将资源名称保存在共享prefs中,并通过以下方式检索可

我目前正在android中使用shared prefs来保存一些设置。这很有效,但我遇到了一个小问题。 在我的共享prefs中,我还保存了一些图像资源ID,以便稍后(在应用程序被销毁后)在新的应用程序启动时访问它们。 现在很明显,一旦我将新资源添加到我的资源树并再次构建应用程序(又名更新),ID就会改变,我将使用以前保存的ID访问不同的资源

您是否有一个想法/方法来保存图像资源ID(或任何其他标识符),而不丢失与它们的链接


非常感谢您。

您可以将资源名称保存在共享prefs中,并通过以下方式检索可绘制资源:

Drawable drawable = getResources().getDrawable(getResources().getIdentifier(yourDrawableName, "drawable", getPackageName()));

R
值将频繁更改,并不意味着稳定

最好的解决方案是,将在应用程序中具有实际业务意义的内容保存在
SharedReferences
中,然后将这些值映射到绘图表和其他项目,您可以使用这些项目呈现这些信息。这样,如果您决定需要重构和重命名这些可绘图项,就不会破坏数据存储


如果您希望懒惰或愿意规定永远不能更改可绘制名称,可以在
Resources
对象上使用类似于
getresourcentryname()
的东西(您可以通过
getResources()
,在任何
上下文
上调用)来查找给定ID的资源的名称,并保留名称。然后,您可以在
Resources
对象上使用
getIdentifier()
来查找相应的
R.drawable
值。

如果我理解得很好,您的意思是我可以声明一些在任何类中硬编码的最终值。然后用这些值指代任何“R.drawable.whatever.”对吗?@binloan:我想是的,尽管我不清楚“用这些值指代”是什么意思。例如,您可以设置一个
HashMap
,其中键是您的逻辑业务值,值是对应图像的
R.drawable
值。您可以将密钥存储在
SharedReferences
中,并根据需要在运行时查找它们的图像。好的,是的,我们的意思是一样的-我的英语有时不像我希望的那样容易理解。最后一个问题。您说过“R值将频繁更改”-这是否意味着即使在运行时也会更改?或者每个实例/活动只执行一次?@binloan:“这是否意味着即使在运行时也执行一次”--不,仅在编译时执行。但是,在编译时对资源的任何更改(添加、删除等)都会影响
R
值。由于它们在构建之间发生变化,因此它们不是用于持久存储之类的东西的稳定标识符。在运行时,对于给定的流程实例,它们是稳定的。这是另一种可能性,但由于我不确定在整个开发过程中我的drawables是否具有相同的名称,所以一旦我更改,可能会有很多更改。无论如何谢谢你!