Использование общих настроек с массивами - PullRequest
1 голос
/ 09 ноября 2011

EDIT: ОК. Оказывается, этот код работал (более или менее), который я оставил в строке, которая сбрасывала логические значения, которые я пытался изменить. Спасибо всем за помощь, хотя.

Возникли проблемы при использовании 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

Должен ли я преобразовывать массивы в строки? Я не понимаю, как их изменить.

Ответы [ 3 ]

1 голос
/ 09 ноября 2011

Я быстро развернул ваш код, создав только оболочку класса рендерера, как вы это делали выше, и обнаружил, что ваш логический элемент сохранения имеет значение false, поэтому он никогда не фиксирует настройки.

Я установил сохранение в true, и поиграл с ним, и с этого все работало нормально.

Я бы порекомендовал добавить чеки к пасхальным яйцам так же, как и для других предпочтений; проверить, совпадает ли текущее значение с сохраненным значением, и если нет, установить флаг сохранения.

0 голосов
/ 09 ноября 2011

Лучшим решением было бы преобразовать ваш массив в строку JSON и сохранить его в качестве значения предпочтения. Если у вас небольшой объем данных, вы также можете использовать классы org.json, предоставляемые android. Если у вас есть больше данных, лучше использовать GSON pull parser, так как он использует pull parser. И если вы действительно ленивы, вы берете мою маленькую библиотеку привязки данных и делаете:

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

0 голосов
/ 09 ноября 2011

Я бы предложил сохранить массив в виде строки в одной переменной.Похоже, у вас есть массив логических значений.Так что сделайте цикл через него, чтобы он представлял собой последовательность из целых чисел (0, 1) или строки «true» или «false», а затем сохраните его в int или string.

Я подозреваю, что проблема может заключаться в том,Название настройки содержит квадратные скобки.Я думаю, что в именах значений ключей имя ключа должно быть допустимым именем переменной.И квадратные скобки не допускаются в именах переменных.

Однако я также ожидал, что это выдаст ошибку.Работает ли код, если вы называете ваши настройки "easteregg_01" и "easteregg_02"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...