2011-11-09 35 views
1

编辑: 确定事实证明,这段代码工作(或多或少)我留在一行重置我想改变的布尔值。谢谢大家的帮助。在阵列中使用共享首选项

在我的应用程序启动时无法使用SharedPreferences读取保存的数组数据。 我的_dPad布尔和我的_FreePlay整数加载,保存和传递我和我的_renderer没有任何问题。

麻烦的开始,当我尝试使用某些阵列 easteregg[]只有2项现在这样很明显,我可能只是刚刚把他们变成独立的变量,但我要补充更长的长度更阿拉斯所以这使得一个方便的测试示例。

我上显示的内容发生代码指出(在easteregg[]设置只是不会出现已经改变)

读取数据:

// Read saved preferences  
    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 

    _renderer._dPad = prefs.getBoolean("_dPad", false);    // * works ok * 
    _renderer._FreePlay = prefs.getInt("_FreePlay", 1);    // * works ok * 
    _renderer.easteregg[0] = prefs.getBoolean("easteregg[0]", false); // * not working 
    _renderer.easteregg[1] = true;      // * even this is not working 

    setRenderer(_renderer); 

写数据:

public void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 

    // As good a time as any to save current config 
    save = false ; // don't commit if nothing changed. 

    SharedPreferences prefs =      
    PreferenceManager.getDefaultSharedPreferences(getContext()); 
    SharedPreferences.Editor editor = prefs.edit(); 

    if (_renderer._dPad != prefs.getBoolean("_dPad",false)){ save = true ; 
    editor.putBoolean("_dPad", _renderer._dPad);} 

    if (_renderer._FreePlay != prefs.getInt("_FreePlay",1)){ save = true ; 
    editor.putInt("_FreePlay", _renderer._FreePlay);} 

    editor.putBoolean("easteregg[0]", _renderer.easteregg[0]); 

    editor.putBoolean("easteregg[1]", _renderer.easteregg[1]); 

    if (save == true){editor.commit();} 

} 

而在.renderer类

// START SAVE DATA 
    public boolean _dPad ; // false no Virtual Pad  *Works Fine* 
    public int _FreePlay ; // 1 = no free play  *Works Fine* 
    public boolean[] easteregg = new boolean[2];  *Values don't load or save* 
    //public boolean easteregg[]; // tried this first *CAUSES CRASH* 
    // END SAVE DATA 

我必须将数组转换为字符串吗?我不知道如何改变它们。

+0

如果不另外声明,则布尔值默认为“false”。你确定你在某个时候改变了价值吗?尝试打印日志语句,然后再保存它并检索它之后。 –

+0

好吧,尽管我有“_renderer.easteregg [1] = true;我知道它在代码中的其他地方没有改变,因为如果我改变“public boolean [] easteregg = new boolean [2];”到“public boolean easteregg []; = {true,true}”,那么值肯定会变为true。 – MarbleMad

回答

1

我把你的代码放到一个快速的活动中,像上面一样创建渲染器类的shell,发现你的保存布尔值是false,所以它从不提交首选项。

我强制保存为true,并且玩了一下,从那里一切正常。

我建议您向复活节彩蛋添加支票,与您对其他偏好的支票相同;测试以查看当前值是否与保存的值相同,如果没有,请设置保存标志。

0

我建议将数组作为字符串保存在一个变量中。看起来你有一组布尔值。因此,通过循环使其成为一系列int(0,1)或字符串“true”或“false”,然后将其保存为int或字符串。

我怀疑这个问题可能是你的设置名称中包含方括号。我认为在键值名称中,键名必须是有效的变量名称。变量名称中不允许使用方括号。

但我也希望这会抛出一个错误。如果您将设置命名为“easteregg_01”和“easteregg_02”,代码是否工作?

+0

首选项可以是任何有效的字符串。只要他所有的复活节彩蛋都是布尔型的,他的代码就没有问题了(除了保存标志从来没有设置好^ _ ^) – Geekswordsman

+0

dd!赶上极客剑客。并感谢关键命名的答案。看起来很疯狂,我可以写一个键“4 * $ = throw(new Error()):%8347”。但我想是这样。 (不是我会,但我可以) –

+0

:-)哦显示代码片段的危险。我的保存标志正在设置 – MarbleMad

0

最好的解决方案是将您的数组转换为JSON字符串并将其存储为优先值。如果你有少量的数据,你可以坚持使用android提供的org.json类。如果你有更多的数据,GSON pull解析器会更好,因为它使用pull语法分析器。而如果你真懒,你抢我的小数据绑定库,并做到:

String jsonState = preferences.getString(GAME_STATE, null); 
StateStorage storage = JSONUnmarshaller.unmarshall(new JsonReader(new    
        StringReader(jsonState)), StateStorage.class); 

,它将实例化的Java类,为您和填写数据。并节省:

SharedPreferences.Editor editor = getPreferences(MODE_PRIVATE).edit(); 
StringWriter writer = new StringWriter(); 
JsonWriter jsonWriter = new JsonWriter(writer); 

JSONMarshaller.marshall(jsonWriter, ss); 
editor.putString(GAME_STATE, writer.toString()); 
editor.commit(); 

数据绑定库可在github上,或从Maven的中央:

https://github.com/ko5tik/jsonserializer

PS:在现阶段,我偏好值的注射工作(目前唯一的原语): https://github.com/ko5tik/andject