【问题标题】:Saving R ids in Shared Prefs在共享首选项中保存 R id
【发布时间】:2015-03-03 13:41:46
【问题描述】:

我目前在 android 中使用共享首选项来保存我的一些设置。这很好用,但我遇到了 R 的一个小问题。 在我的共享首选项中,我还保存了一些图像资源 ID,以便稍后(在应用程序被销毁后)在新应用程序启动时访问它们。 现在显然,一旦我将新资源添加到我的资源树并再次构建应用程序(也称为更新),ID 就会发生变化,并且我正在使用我之前保存的 ID 访问不同的资源。

您有什么想法/方法如何在不丢失链接的情况下保存图像资源 ID(或任何其他标识符)?

非常感谢您。

【问题讨论】:

    标签: android sharedpreferences identifier r.java-file


    【解决方案1】:

    R 值会经常变化,并不意味着稳定。

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

    如果你想偷懒或者愿意规定你永远不能更改可绘制的名称,你可以在Resources对象上使用getResourceEntryName()之类的东西(你可以通过getResources()获得其中之一,调用任何 Context),以查找给定 ID 的资源的名称,并保留该名称。然后,您可以在 Resources 对象上使用 getIdentifier(),以便稍后查找相应的 R.drawable 值。

    【讨论】:

    • 如果我理解你的意思,你的意思是我可以声明一些我在任何类中硬编码的最终值。然后将这些值引用到任何“R.drawable.whatever”。对吗?
    • @binloan:我想是的,但我不清楚“参考这些值”是什么意思。例如,您可以设置HashMap<Integer, Integer>,其中键是您的逻辑业务值,值是它们对应图像的R.drawable 值。您可以将密钥存储在 SharedPreferences 中,并根据需要在运行时查找它们的图像。
    • 好吧是的,我们的意思是一样的——我的英语有时不像我想要的那样容易理解。最后一个问题。您说“R 值会经常变化”——这是否意味着即使在运行时?还是每个实例/活动只有一次?
    • @binloan:“这是否意味着即使在运行时”——不,仅在编译时。但是,编译时资源的任何更改(添加、删除等)都会影响R 的值。由于它们在构建之间发生变化,因此它们不是用于持久存储等事物的稳定标识符。在运行时,对于给定的流程实例,它们是稳定的。
    【解决方案2】:

    您可以将资源名称保存在共享首选项中并通过以下方式检索 Drawable:

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

    【讨论】:

    • 这是另一种可能性,但由于我不确定我的可绘制对象是否在整个开发过程中都具有相同的名称,所以一旦我更改,可能会有很多变化。还是谢谢你!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2019-04-09
    • 2017-12-02
    相关资源
    最近更新 更多