2015-03-03 78 views
0

我目前在Android中使用共享首選項來保存一些設置。這很好,但我遇到了R的一個小問題。 在我的共享首選項中,我還保存了一些圖像資源ID,以便稍後(在應用程序被銷燬後)在新應用程序啓動時對其進行訪問。 現在很明顯,一旦我向資源樹添加新資源並再次構建應用程序(又名更新),ID將更改,並且我正在使用之前保存的ID訪問其他資源。在共享首選項中保存R ID

你有想法/方法如何保存圖像資源ID(或任何其他標識符),而不會丟失鏈接到他們?

非常感謝您提前。

回答

2

R值會經常變化,並不意味着是穩定的。

最好的解決方案是讓您在應用中保存具有實際業務含義的SharedPreferences,然後將這些值映射到可用於繪製該信息的可繪製表和其他項。這樣,如果您決定需要重構並重命名這些可繪製對象,則不會破壞數據存儲。

如果你想偷懶或其他願意規定,你永遠無法改變繪製的名字,你可以一個Resources對象上使用類似getResourceEntryName()(你可以通過getResources()其中之一,呼籲任何Context) ,找到給定其ID的資源的名稱,並保留該名稱。然後,您可以在Resources對象上使用getIdentifier()以便稍後查找相應的R.drawable值。

+0

如果我理解你的意思,你的意思是我可以聲明一些最終值,我可以在任何類中進行硬編碼。然後將這些值引用到任何「R.drawable.whatever」中。對? – binloan 2015-03-03 13:57:38

+0

@binloan:我這麼認爲,儘管我不清楚「用這些值來引用」的含義。例如,您可以設置一個'HashMap ',其中的鍵是您的邏輯業務值,值是其對應圖像的'R.drawable'值。您可以將密鑰存儲在'SharedPreferences'中,並根據需要在運行時查找它們的圖像。 – CommonsWare 2015-03-03 14:11:18

+0

好吧好吧,我們的意思是一樣的 - 我的英語有時候並不像我想要的那樣容易理解。最後一個問題。你說'R值會頻繁變化' - 這是否意味着即使在運行時?或者每個實例/活動只有一次? – binloan 2015-03-03 14:38:43

0

您可以在首選項共享保存您的資源名稱和檢索繪製對象:

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

這是另一種可能性,但由於我不確定我的繪圖在整個開發過程中是否會有相同的名稱,所以一旦我改變,它可能會有很多改變。無論如何謝謝你! – binloan 2015-03-03 14:00:11