如何保存和加载布尔数组 Android Studio

Posted

技术标签:

【中文标题】如何保存和加载布尔数组 Android Studio【英文标题】:How to save and load Boolean array Android Studio 【发布时间】:2020-02-25 01:10:03 【问题描述】:

我正在制作一个带有关卡的安卓游戏。我制作了一个 Button[][] 数组,其中每个 Button 都 setEnabled(false) 除了第一个设置为 true 的按钮,因为它允许玩家开始游戏并“解锁”其他关卡。我存储了一个带有按钮启用状态的全局布尔数组,这样每次我进入“LevelsActivity”时,我都可以读取布尔数组并更新按钮状态。所有这一切都很好。

我的问题是关于如何保存这个布尔数组,以便我可以在应用关闭后加载它。

我阅读了有关 SharedPreferences 的信息,并找到了一些代码,但我无法实现我的目的。此外,我读到 SharedPreferences 不支持该数组,我应该将数组转换为字符串,但我仍然做不到。提前致谢

如果有帮助的话,这是我的 Global 课程:

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;
    

【问题讨论】:

How to add a Boolean Array in Shared preferences in android的可能重复 【参考方案1】:

你不能直接放一个布尔数组,但是你可以为每个级别放一个布尔值。比如:

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);
...

【讨论】:

【参考方案2】:

我会将它作为 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';
            
        

【讨论】:

【参考方案3】:

您可以使用 gson 库来序列化您的数据,然后将其保存在 sharedPref 中:

    Gson gradle 依赖

    implementation 'com.google.code.gson:gson:2.8.6'
    

    序列化数组

      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
    

    保存在 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"
    
    

【讨论】:

以上是关于如何保存和加载布尔数组 Android Studio的主要内容,如果未能解决你的问题,请参考以下文章

如何从复选框数组中保存布尔状态并在使用 SharedPreferences 加载适配器时加载它们的状态

Android:如何保存转换为数组值的 EditText 并将它们加载回原位

保存和加载 Int 数组

如何保存和加载 Android 活动的预设?

如何从 Android 的 MainActivity 中保存 ArrayList?

在应用加载时保存为用户默认值