【问题标题】:Android shared preferences not savingAndroid共享首选项未保存
【发布时间】:2012-03-29 11:32:55
【问题描述】:

我创建了一个 Android 动态壁纸,我试图让用户从他们的手机中选择一张图片并将其应用为背景图片,但是当我启动启动意图选择图片的活动时,我的共享首选项似乎无法正确保存。

下面是我在用户按下首选项按钮时启动的活动的 onCreate 方法,以及获取设备上图像路径的 onActivityResult(所有这些似乎都有效)。我提交首选项后的 println 什么也没有打印出来。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK);
    photoPickerIntent.setType("image/*");
    startActivityForResult(photoPickerIntent, SELECT_PICTURE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);

            preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
            preferences.edit().putString(SETTINGS_BACKGROUND_IMAGE, "okok");
            preferences.edit().commit();

            System.out.println("Image" + preferences.getString(SETTINGS_BACKGROUND_IMAGE, ""));
        }
    }

    finish();
}

【问题讨论】:

    标签: android preferences wallpaper preference


    【解决方案1】:

    来自documentation

    为这些首选项创建一个新的编辑器,通过它您可以 修改首选项中的数据并自动提交 这些更改回 SharedPreferences 对象。

    因为这是一个新的编辑器实例,你的代码应该更像这样:

    preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok");
    editor.apply();
    

    【讨论】:

    • 只有我一个人看不出这个和原始代码在逻辑上的区别吗?
    • 当您调用preferences.edit() 时,您会得到一个Editor 实例,joE 在该实例上放置一个字符串,但之后不再使用该实例(因此丢失,并且可能被垃圾收集) .然后,jOE 再次调用了preferences.edit(),得到了另一个包含初始设置的编辑器实例,他刚刚保存了这些设置。这基本上只是保存了初始设置(没有更新他的共享偏好)
    • zrgui,非常感谢您的帮助!您的建议非常有效!
    • 谢谢你,你拯救了我的一天。问题中描述的共享偏好行为让我感到非常困惑。
    • 谢谢!这个问题很难调试,特别是当很多答案只是创建一个编辑器对象但没有明确提及它时。
    【解决方案2】:

    尝试另一种初始化 SharedPreferences 变量的方法:

    SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this);
    

    你也可以用sf.edit().putString(string, value).commit();链接写到sf

    【讨论】:

    • 我不想再把它锁起来了。
    【解决方案3】:

    好吧,基于@zrgiu 帖子,对我来说,在使用编辑器之前只添加了editor.clear();...所以最终代码将类似于:

    preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
    SharedPreferences.Editor editor = preferences.edit();
    editor.clear();
    editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok");
    editor.commit();
    

    ;)

    【讨论】:

    • 为我工作,但你能解释为什么会这样吗?
    【解决方案4】:

    就我而言,我必须添加 editor.apply();在提交之前才能工作。

    这是我的代码:

    preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0);
    SharedPreferences.Editor editor = preferences.edit();
    editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok");
    editor.apply();//I added this line and started to work...
    editor.commit();
    

    【讨论】:

    • apply 是同步保存数据,而 commit 是立即保存,你不应该同时使用它们!!!
    【解决方案5】:

    请记住,您需要相同的活动来保存和检索数据。你不能使用像

    这样的方法
    public String readValue(Activity activity, String key) {
        SharedPreferences sp = activity.getPreferences(Context.Mode_PRIVATE);
       //...
    }
    

    要从同一活动中接收相同的数据,您需要使用与您保存数据的完全相同的活动来调用此方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-19
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多