what is the Best way to use shared preferences between activities

后端 未结 4 814
悲哀的现实
悲哀的现实 2020-12-08 16:13

I have a user preference in my app, which gets used by different activities. I would like to know the best way to utilize those preferences between different activities in m

相关标签:
4条回答
  • 2020-12-08 16:20

    Sending shared preferences through intents seems overcomplicated. You could wrap the shared preferences with something like the below and call the methods directly from your activities:

    public class Prefs {
        private static String MY_STRING_PREF = "mystringpref";
        private static String MY_INT_PREF = "myintpref";
    
        private static SharedPreferences getPrefs(Context context) {
            return context.getSharedPreferences("myprefs", 0);
        }
    
        public static String getMyStringPref(Context context) {
            return getPrefs(context).getString(MY_STRING_PREF, "default");
        }
    
        public static int getMyIntPref(Context context) {
            return getPrefs(context).getInt(MY_INT_PREF, 42);
        }
    
        public static void setMyStringPref(Context context, String value) {
            // perform validation etc..
            getPrefs(context).edit().putString(MY_STRING_PREF, value).commit();
        }
    
        public static void setMyIntPref(Context context, int value) {
            // perform validation etc..
            getPrefs(context).edit().putInt(MY_INT_PREF, value).commit();
        }
    }
    
    0 讨论(0)
  • 2020-12-08 16:20

    You can use this way and declare same variables with same name in all activites where you want to use.

      public static final String PREFS_NAME = "MyPrefsFile";
      static SharedPreferences settings;
      SharedPreferences.Editor editor;
      int wordCount;
    
     public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        settings = getSharedPreferences(PREFS_NAME, 0);
        editor = settings.edit();
    
        wordCount = settings.getInt("wordCount", 4); 
    
      }
    

    Here initially wordCount will give 4; And when you edit wordCount and want to store again

      editor.putInt("wordCount", 6);
      editor.commit();
    

    You have to declare this same variables in activities where you want to use shared preferences. And its better you call getSharedPreferences in every activity.

    I don't think that passing that preference in intent will work.

    0 讨论(0)
  • 2020-12-08 16:25

    Here's a nice & easy solution in Kotlin – just copy & paste the code into a new AppPreferences.kt file and follow the 4 TODO steps outlined in the code:

    import android.content.Context
    import android.content.Context.MODE_PRIVATE
    import android.content.SharedPreferences
    import androidx.core.content.edit
    
    object AppPreferences {
        private var sharedPreferences: SharedPreferences? = null
    
        // TODO step 1: call `AppPreferences.setup(applicationContext)` in your MainActivity's `onCreate` method
        fun setup(context: Context) {
            // TODO step 2: set your app name here
            sharedPreferences = context.getSharedPreferences("<YOUR_APP_NAME>.sharedprefs", MODE_PRIVATE)
        }
    
        // TODO step 4: replace these example attributes with your stored values
        var heightInCentimeters: Int?
            get() = Key.HEIGHT.getInt()
            set(value) = Key.HEIGHT.setInt(value)
    
        var birthdayInMilliseconds: Long?
            get() = Key.BIRTHDAY.getLong()
            set(value) = Key.BIRTHDAY.setLong(value)
    
        private enum class Key {
            HEIGHT, BIRTHDAY; // TODO step 3: replace these cases with your stored values keys
    
            fun getBoolean(): Boolean? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getBoolean(name, false) else null
            fun getFloat(): Float? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getFloat(name, 0f) else null
            fun getInt(): Int? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getInt(name, 0) else null
            fun getLong(): Long? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getLong(name, 0) else null
            fun getString(): String? = if (sharedPreferences!!.contains(name)) sharedPreferences!!.getString(name, "") else null
    
            fun setBoolean(value: Boolean?) = value?.let { sharedPreferences!!.edit { putBoolean(name, value) } } ?: remove()
            fun setFloat(value: Float?) = value?.let { sharedPreferences!!.edit { putFloat(name, value) } } ?: remove()
            fun setInt(value: Int?) = value?.let { sharedPreferences!!.edit { putInt(name, value) } } ?: remove()
            fun setLong(value: Long?) = value?.let { sharedPreferences!!.edit { putLong(name, value) } } ?: remove()
            fun setString(value: String?) = value?.let { sharedPreferences!!.edit { putString(name, value) } } ?: remove()
    
            fun remove() = sharedPreferences!!.edit { remove(name) }
        }
    }
    
    0 讨论(0)
  • 2020-12-08 16:41

    You can of course use shared preferences in your applications.

    If you have more than a simple type than string or int, you can use a singleton or extends the application class which will be accessible by all activities of your application. => No disk access here. Simply kept in memory.

    0 讨论(0)
提交回复
热议问题