Android - How to use SharedPreferences in non-Activity class?

后端 未结 12 2317
日久生厌
日久生厌 2020-12-13 08:54

How do you use SharedPreferences in a non-Activity class? I tried making a generic Preferences utility class and importing android.content.Context but Eclipse s

相关标签:
12条回答
  • 2020-12-13 09:18

    In Kotlin, there's a nice & simple wrapper-based solution – 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) }
        }
    }
    

    Now from anywhere within your app you can get a value like this:

    val heightInCentimeters: Int? = AppPreferences.heightInCentimeters
    val heightOrDefault: Int = AppPreferences.heightInCentimeters ?: 170
    

    Setting a value to the SharedPreferences is just as easy:

    AppPreferences.heightInCentimeters = 160 // sets a new value
    
    0 讨论(0)
  • 2020-12-13 09:20

    For Kotlin and for default preference file, you can use the following code:

    val sharedPref = activity?.getPreferences(Context.MODE_PRIVATE)
    
    0 讨论(0)
  • 2020-12-13 09:26

    Using a static method to use SharedPreference without Context Object explained here

    In MainActivity before OnCreate

    public static SharedPreferences preferences;
    

    In OnCreate method add

    preferences = getSharedPreferences( getPackageName() + "_preferences", MODE_PRIVATE);
    

    Create a PreferenceHelper Class with static methods of Getters and Setters

    public class PreferenceHelper {
    
    final public static String KEY_DEMO_NAME = "Demo Name";
    public static void setName(String value) {
        MainActivity.preferences.edit().putString(KEY_DEMO_NAME, value ).commit();
    }
    public static String getName() {
        return MainActivity.preferences.getString(KEY_DEMO_NAME,"");
    }
    

    }

    0 讨论(0)
  • In main activity add: u will get global static shared preferences object

     companion object {    
        lateinit var sharedPreferences: SharedPreferences
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
     sharedPreferences = applicationContext.getSharedPreferences(
            SHARED_PREFERENCE_NAME,
            Context.MODE_PRIVATE
        )
    
    0 讨论(0)
  • 2020-12-13 09:29

    Try using default preferences with an Application context. A context is similar to the environment an application runs in on linux or windows (e.g. environment variables like PATH windowing style or console size). Each Activity and Service has its own Context too for example screen orientation, theme, and label, etc. but for your application you don't want the context of the Activity, you want something global to the app, this is where context.getApplicationContext() is useful. This the same throughout the app and will always give you the same default preferences.

    0 讨论(0)
  • 2020-12-13 09:32

    Use this code to get the context from activity.

    if (context != null) {
        SharedPreferences sharedPrefs = context.getSharedPreferences("YOUR.PACKAGE.NAME", MODE_PRIVATE);
    }
    
    0 讨论(0)
提交回复
热议问题