Как сохранить и загрузить логический массив Android Studio - PullRequest
1 голос
/ 29 октября 2019

Я делаю игру для Android с уровнями. Я создал массив Button [] [], для которого каждая кнопка имеет setEnabled (false), за исключением первого, для которого было установлено значение true, чтобы позволить игрокам начать игру и «разблокировать» другие уровни. Я сохранил глобальный логический массив с состоянием включения кнопки, так что каждый раз, когда я вхожу в «LevelsActivity», я могу читать логический массив и обновлять состояния кнопок. И все это прекрасно работает.

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

Я прочитал о SharedPreferences и узнал некоторый кодно я не могу реализовать свою цель. Кроме того, я прочитал, что массив не поддерживается SharedPreferences, и я должен преобразовать массив в строку, но я все еще не могу это сделать. Заранее спасибо

Это мой Глобальный класс, если он может помочь:

public class Globals extends Application {

    private boolean[] array = new boolean[125];

    public Globals() {
        for (int i = 0; i < 125; i++) {
            array[i] = false;
        }
        array[0] = true;
    }

    public boolean getData(int i){
        return this.array[i];
    }

    public void setData(int i, boolean value){
        this.array[i]=value;
    }
}

Ответы [ 3 ]

0 голосов
/ 29 октября 2019

Я бы сохранил его как строку из 0 и 1 в одном SharedPrefs, а затем прочитал бы эту строку и заполнил бы логический массив, основанный на этом.

 SharedPreferences preferences =
                getApplicationContext().getSharedPreferences("PREFS", Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = preferences.edit();
        // Write
        boolean[] array = new boolean[125];
        StringBuilder builder = new StringBuilder();
        for (boolean i : array) {
            builder.append(i ? '1' : '0');
        }


        editor.putString("BOOLEAN_ARRAY", builder.toString()).apply();

        // Read
        String arrayPrefs = preferences.getString("BOOLEAN_ARRAY",null);

        if(!TextUtils.isEmpty(arrayPrefs)){
            for(int i = 0; i < array.length;i++){
                 array[i] = arrayPrefs.charAt(i) == '1';
            }
        }
0 голосов
/ 29 октября 2019

Вы можете использовать библиотеку gson для сериализации ваших данных и затем сохранить их в sharedPref:

  1. Зависимость Gson Gradle

    implementation 'com.google.code.gson:gson:2.8.6'
    
  2. Сериализующий массив

      val arrayOfBooleans = arrayOf(false, true, false, true)
      // or you could use hashMap which has more readable output after serialization
      val mapOfBooleans = mapOf(1 to false, 5 to true)
    
      val serializedJson1 = Gson().toJson(arrayOfBooleans) // [false,true,false,true]
      val serializedJson2 = Gson().toJson(mapOfBooleans) // {"1":false,"5":true}
    
  3. Сохранение в SharedPreferences

    fun saveData(json: String) {
    val prefManager =  PreferenceManager.getDefaultSharedPreferences(context)
        prefManager
            .edit()
            .putString(KEY_OF_DATA, json)
            .apply()
    }
    companion object {
        const val KEY_OF_DATA = "keyOfData"
    }
    
0 голосов
/ 29 октября 2019

Вы не можете поместить логический массив напрямую, но вы можете поместить логический для каждого уровня. Что-то вроде:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences();
SharedPreferences.Editor editor = prefs.edit();  
editor.putBoolean("level_one", true);
editor.putBoolean("level_two", false);
...
editor.commit();

и затем, когда вы дойдете до действия, где вам нужно проверить эти значения, вы можете получить их с помощью

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences();
Boolean level_one = prefs.getBoolean("level_one", false);
Boolean level_two = prefs.getBoolean("level_two", false);
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...