对阵列使用共享首选项

时间:2011-11-09 18:00:30

标签: android arrays string sharedpreferences

修改 好的事实证明这个代码工作(或多或少)我离开了一行,重置了我试图改变的布尔值。谢谢大家的帮助。

在我的应用启动时,无法使用SharedPreferences读取已保存的数组数据。 我的_dPad布尔值和我的_FreePlay整数加载,保存并传入和传出_renderer毫无问题。

当我尝试使用某些数组时,麻烦就开始了 easteregg[]现在只有2个条目,所以很明显我可以把它们变成单独的变量,但我希望添加更长的更长的arras,这样就可以作为一个方便的测试示例。

我已经注意到代码似乎发生了什么(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

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

3 个答案:

答案 0 :(得分:1)

我把你的代码放到一个快速活动中,如上所述只创建渲染器类的shell,发现你的保存布尔值为false,所以它永远不会提交首选项。

我强制保存为真,然后用它来玩,一切都很顺利。

我建议在复活节彩蛋中加入与任何其他偏好相同的检查;测试当前值是否与保存的值相同,如果不相同,则设置保存标志。

答案 1 :(得分:0)

我建议将数组保存为单个变量中的字符串。看来你有一系列布尔值。因此,遍历它以使其成为一系列的ints(0,1)或字符串“true”或“false”,然后将其保存为int或string。

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

但是我也希望这会引发错误。如果您将设置命名为“easteregg_01”和“easteregg_02”,代码是否有效?

答案 2 :(得分: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 central上找到:

https://github.com/ko5tik/jsonserializer

PS:目前我正在处理首选项值的注入(仅限原语): https://github.com/ko5tik/andject