2012-08-02 111 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