Android共享首选项不保存

jOE*_*jOE 38 android wallpaper preferences preference

我创建了一个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();
}
Run Code Online (Sandbox Code Playgroud)

zrg*_*giu 86

文档:

为这些首选项创建一个新的编辑器,通过该编辑器可以对首选项中的数据进行修改,并将这些更改原子地提交回SharedPreferences对象.

由于这是一个新的Editor实例,您的代码应该更像这样:

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

  • 当你调用preferences.edit()时,你得到一个编辑器实例,jOE在其上放置一个字符串,但之后,该实例不再使用(因此丢失,可能是垃圾收集).然后,jOE再次调用preferences.edit(),获取另一个包含初始设置的Editor实例,并将其保存到位.这基本上只保存了初始设置(没有更新他的共享首选项) (42认同)
  • 我是唯一一个看不出这个和原始代码之间逻辑差异的人吗? (22认同)
  • 谢谢你,你救了我的一天.问题中描述的共享偏好行为对我来说真的很混乱. (2认同)

jos*_*hus 16

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

SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this);
Run Code Online (Sandbox Code Playgroud)

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