【问题标题】:Sharedpreferences returning null value after savingSharedpreferences 保存后返回空值
【发布时间】:2015-10-11 09:03:02
【问题描述】:

我有一个带有两个单选按钮的单选组。我想选择一个单选按钮并点击保存,这样当我返回时,同一个单选按钮就会被选中。问题是,即使在我点击保存 onCreate 中的 sharedpreferences 后,它也总是返回 null。我知道保存功能正在执行,因为 toast 运行并且我在控制台中打印了 System.out.println。

public void saveSettings(View view)
{
    Toast.makeText(getApplicationContext(), "Settings Saved", Toast.LENGTH_LONG).show();

    //DETERMINE WHICH RADIO BUTTON IS SELECTED
    RadioButton lbSetting = (RadioButton)findViewById(R.id.weightSettingLB);
    RadioButton kgSetting = (RadioButton)findViewById(R.id.weightSettingKG);
    if(lbSetting.isChecked())
    {
        weightSetting = "lb";
    }
    if(kgSetting.isChecked())
    {
        weightSetting = "kg";
    }

    System.out.println("The " + weightSetting + " radio button has been selected.");

    //SAVE WEIGHT SETTING BETWEEN LB/KG
    settingsPrefString = getSharedPreferences(weightSetting, 0);
    SharedPreferences.Editor editor = settingsPrefString.edit();
    editor.putString("weightSetting", weightSetting);
    editor.commit();
}

在我的 onCreate 中,我尝试将保存的数据检索为

if(settingsPrefString != null)
{
    weightSetting = settingsPrefString.getString("weightSetting", "Couldn't load data!");
}
if(settingsPrefString == null)
{
    System.out.println("settingsPrefString is NULL!");
}

即使在我点击保存后,sharedpreferences 也总是返回为 null。

【问题讨论】:

  • getSharedPreferences() 方法中的第一个参数是您要访问的首选项文件的名称。使其保持不变 - 例如,"weight_settings" - 而不是 weightSetting 变量的变化值。
  • 你能在 onCreate 中添加如何初始化 settingsPrefString
  • public SharedPreferences settingsPrefString;就在 onCreate 方法的上方
  • 不声明...我说的是初始化你是在做 settingsPrefString = getSharedPreference(.. inside onCreate....如果没有那么你的 settingsPrefString 将为空......

标签: java android


【解决方案1】:

在需要时调用这些函数:

private void savePreferences(String key, String value){
    SharedPreferences sharedPreferences = getSharedPreferences("weightSetting", MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(key, value);
    editor.commit();
   }


  private String loadPreferences(String key){
    SharedPreferences sharedPreferences = getSharedPreferences("weightSetting", MODE_PRIVATE);
    String load = sharedPreferences.getString(key, "");
    return load;

   }
}

例如:

savePreferences("selected", "lb");

String s = loadPreferences("selected);

【讨论】:

    【解决方案2】:

    您正在做的错误是在 saveSettings 方法中。在为第一个创建共享首选项时,您没有为其分配常量名称,因为您已使用变量作为名称,因此请更改它。为相同创建一个全局字符串常量

    //SAVE WEIGHT SETTING BETWEEN LB/KG
    settingsPrefString = getSharedPreferences(weightSetting, 0);
    SharedPreferences.Editor editor = settingsPrefString.edit();
    

    public static final String SETTINGS_PREFERENCE = "SETTINGS_PREFERENCE"
    SharedPreference settingsPrefString
    
    //your code
    //saveSettings method
    //SAVE WEIGHT SETTING BETWEEN LB/KG
    settingsPrefString = getSharedPreferences(SETTINGS_PREFERENCE , Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = settingsPrefString.edit();
    

    如果您查看更改,则会使用两个常量,这使代码更具可读性和可访问性。

    下次在你的 onCreate() 方法中你必须添加

    settingsPrefString = getSharedPreferences(SETTINGS_PREFERENCE , Context.MODE_PRIVATE);
    
    if(settingsPrefString != null)
    {
        weightSetting = settingsPrefString.getString("weightSetting", "Couldn't load data!");
    } else {
        System.out.println("settingsPrefString is NULL!");
    }
    

    【讨论】:

    • @th3ramr0d 欢迎...或者您可以使用 WaldiDog 提供的解决方案...您可以增强您的代码结构...但唯一的问题是在保存和加载数据时...bcoz every时间你只会保存和加载字符串数据,以便需要正确处理
    【解决方案3】:

    替换

    settingsPrefString = getSharedPreferences(weightSetting, 0);
    

    settingsPrefString = getSharedPreferences(weightSetting, Context.MODE_PRIVATE);
    

    这也有帮助

    settingsPrefString = PreferenceManager.getDefaultSharedPreferences(this);
    

    并关注this link

    【讨论】:

    • Context.MODE_PRIVATE 是常量,值为 0,因此直接传递 0 或使用 Context.MODE_PRIVATE 相同,您可以参考:developer.android.com/reference/android/content/…
    • weightSetting 设为修复。不要改变它的价值。你也试过调试你的代码吗?
    猜你喜欢
    • 2016-06-18
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多