2012-08-02 115 views
4

我的英语非常非常糟糕,因为我是俄语。 :)重启设备后的Android SharedPreferences

在我的应用程序中,我使用SharedPreferences来存储我的值。 数据已存储在SharedPreferences中,当应用程序正在运行时以及退出后。一切正常,直到我重新启动我的设备。重新启动后,我无法使用SharedPreferences,并且应用程序不会从那里读取和写入数据。 我使用函数getPreferences(0)从应用程序数据文件夹中获取首选项。 我也试过用getSharedPreferences(myPref, MODE_PRIVATE),但效果是一样的。重启设备后只保存一个解决方案 - 数据清理应用程序。

favoriteButton = (ImageView) findViewById(R.id.favorite_button); 
    SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE); 
    if(favorite.getString(""+Loader.currentVideo.getTitle()+"", "") == "true") { 
     favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected)); 
    } else { 
     favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty)); 
    } 
    favoriteButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE); 
      SharedPreferences.Editor editor = favorite.edit(); 
      if(favorite.getString(""+Loader.currentVideo.getTitle()+"", "") == "true") { 
       favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty)); 
       Loader.favoriteVideos.remove(Loader.currentVideo); 
       editor.remove(""+Loader.currentVideo.getTitle()+""); 
      } else { 
       favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected)); 
       Loader.favoriteVideos.add(Loader.currentVideo); 
       editor.putString(""+Loader.currentVideo.getTitle()+"", "true"); 
      } 
      editor.commit(); 
     } 
    }); 
+1

这是由于SharedPreferences在重启时被终止。看看[数据存储选项](http://developer.android.com/guide/topics/data/data-storage.html)。 – 2012-08-02 11:41:56

+0

请发布您正在尝试的代码。如果您发现任何问题,请记录日志。 – AAnkit 2012-08-02 11:42:08

+2

@Cdr。 Powell - SharedPreferences存储在闪存驱动器上的文件中,重新启动不会影响该文件。 – mah 2012-08-02 11:45:16

回答

0

请试试用link。它应该工作。我在我的设备上测试了它,并且工作正常。尝试了解它并在您的应用中进行必要的更改。

+0

三年半在链接不再工作 – Atul 2016-04-18 08:56:40

1

以下代码应该适用于您保存sharedpreferences。重要的部分是edit.commit(); 如果这不起作用,那么可能是你使用的是具有一定的不同的行为与手机制造商可能已经修改一些手机..

private static final String PREFERENCES = "Preferences"; 
static protected SharedPreferences getSharedPreferences(Context context) { 

    return context.getSharedPreferences(PREFERENCES, Context.MODE_PRIVATE); 
} 

public void setString(String setting, String value) { 

    SharedPreferences settings = getSharedPreferences(getApplicationContext()); 
    Editor edit = settings.edit(); 
    edit.putString(setting, value); 
    edit.commit(); 
} 
+0

这是工程,我可以看到该文件与数据文件夹中的偏好当我的应用程序不运行,并在重新启动设备后,我看到这个文件! – BarkovAndrey 2012-08-02 11:59:08

+0

但只有在重新启动我的设备后,我的应用程序才能看到此文件。 – BarkovAndrey 2012-08-02 12:00:24

+0

该文件继续保存我的值,但是当我在重启设备后调用getPreferences()时,无法获取并写入此文件。我在重新启动后解决所有问题 - 清除我的应用程序数据。 – BarkovAndrey 2012-08-02 12:02:23

2

谢谢大家对您的咨询!但我解决了这个问题! 我希望这可以帮助别人,这里有一个解决方案。

在请求SharedPreferences值之前,请检查密钥的可用性! SharedPreferences sharedpreferences = getSharedPreferences(“SharedPreferences”,MODE_PRIVATE); sharedpreferences.contains(“key”) ---检查密钥!

favoriteButton = (ImageView) findViewById(R.id.favorite_button); 
    SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE); 
    String tempFav = ""; 
    if(favorite.contains(""+Loader.currentVideo.getTitle()+"")) { 
     tempFav = favorite.getString(""+Loader.currentVideo.getTitle()+"", ""); 
    } 
    if(tempFav.equalsIgnoreCase("true")) { 
     favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected)); 
    } else { 
     favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty)); 
    } 
    favoriteButton.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      SharedPreferences favorite = getSharedPreferences("Favorites", MODE_PRIVATE); 
      SharedPreferences.Editor editor = favorite.edit(); 
      String tempCFav = ""; 
      if(favorite.contains(""+Loader.currentVideo.getTitle()+"")) { 
       tempCFav = favorite.getString(""+Loader.currentVideo.getTitle()+"", ""); 
       Log.d(Loader.currentVideo.getTitle()); 
       Log.d(tempCFav); 
      } 
      if(tempCFav.equals("true")) { 
       favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_empty)); 
       Loader.favoriteVideos.remove(Loader.currentVideo); 
       editor.remove(""+Loader.currentVideo.getTitle()+""); 
      } else { 
       favoriteButton.setImageDrawable(getResources().getDrawable(R.drawable.fav_selected)); 
       Loader.favoriteVideos.add(Loader.currentVideo); 
       editor.putString(""+Loader.currentVideo.getTitle()+"", "true"); 
      } 
      editor.commit(); 
     } 
    }); 
+0

如果最喜欢的字符串包含订阅和另一个选项取消订阅?.contains将返回true。请参阅我的答案,如下所示:http://stackoverflow.com/questions/36939380/android-persistent-checkable-menu-in-custom-widget-after-reboot-android/36998250# 36998250 – iOSAndroidWindowsMobileAppsDev 2016-05-03 07:43:29