Android - Как использовать SharedPreferences в не-классе деятельности? - PullRequest
38 голосов
/ 21 сентября 2011

Как вы используете SharedPreferences в не-классе активности? Я попытался создать универсальный служебный класс Preferences и импортировать android.content.Context, но Eclipse все равно не позволил бы мне использовать getSharedPreferences().

Ответы [ 9 ]

48 голосов
/ 21 сентября 2011

SharedPreferences связаны с контекстом.Вы можете ссылаться на него только через контекст.

Вы можете просто передать контекст как параметр своему классу.Например, в конструкторе.

В своей деятельности выполните:

MyClass myClass = new MyClass(this);
44 голосов
/ 29 мая 2013

Решение, которое я нашел для этого, было:

1 - В классе MainActivity (т.е. всегда запускается до получения какого-либо контекста в проекте) создайте статическую переменную для контекста:

public static Context contextOfApplication;

2 - В методе importante этого класса (например, onCreate, конструктор и т. Д.) Инициализируйте эту переменную с помощью метода getApplicationContext:

public void onCreate() {
    contextOfApplication = getApplicationContext();
}

3-В том же классе Создайте метод "getter" для этой переменной (он также должен быть статическим):

public static Context getContextOfApplication(){
    return contextOfApplication;
}

4 - В классе бездействия получить контекст, статически вызывая созданный метод:

Context applicationContext = MyActivityClass.getContextOfApplication();

5-Используйте класс PreferenceManager, чтобы получить переменную SharedPreferences:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(applicationContext);

Надеюсь, это поможет.

2 голосов
/ 21 сентября 2011

Попробуйте использовать настройки по умолчанию с контекстом приложения. Контекст подобен среде, в которой приложение работает в Linux или Windows (например, переменные среды, такие как стиль окон PATH или размер консоли). Каждое действие и служба также имеет свой собственный контекст, например, ориентацию экрана, тему, метку и т. Д., Но для вашего приложения вам не нужен контекст действия, вам нужно что-то глобальное для приложения, вот где context.getApplicationContext () полезен. Это одинаково для всего приложения и всегда дает одинаковые настройки по умолчанию.

1 голос
/ 21 сентября 2018

В Kotlin вы можете сделать это:

val myClass = MyClass(this)

Теперь вот как вы можете получить контекст в классе

class MyClass(context: Context) {

    val context: Context = context

}

Теперь, чтобы получить общие настройки с контекстом, вы можете сделать это:

context.getSharedPreferences(...)
1 голос
/ 06 июня 2017

используйте этот код для нового класса.

import android.content.Context;
import android.content.SharedPreferences;

/**
   * Created by Atiar Talukdar on 6/5/2017.
*/

public class TemporaryStorageSharedPreference {
protected final static int DEFAULT = 0;
int temp = 0;

public int readSharedPreference(Context context, String spName,String key){
    SharedPreferences sharedPreferences = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
    return temp = sharedPreferences.getInt(key,DEFAULT);
}

public void writeSharedPreference(Context context,String ammount,String spName,String key ){

    SharedPreferences sharedPreferences = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt(key, DEFAULT);
    editor.commit();
}
}
0 голосов
/ 01 сентября 2018

Используйте этот код, чтобы получить context от активности.

if (context != null) {
    SharedPreferences sharedPrefs = context.getSharedPreferences("YOUR.PACKAGE.NAME", MODE_PRIVATE);
}
0 голосов
/ 03 мая 2018

Использование статического метода для использования SharedPreference без объекта контекста объяснение здесь

In MainActivity до OnCreate

public static SharedPreferences preferences;

В OnCreate метод add

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

Создание PreferenceHelper класса сстатические методы геттеры и сеттеры

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 голосов
/ 07 марта 2018

создать класс SharedPreferences

 /**
     * @param mContext
     * @param key
     * @param value
     */
    public static void savePreferences(Context mContext, String key, String value) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString(key, value).apply();
    }

    /**
     * @param context
     * @param keyValue
     * @return
     */
    public static String getPreferences(Context context, String keyValue) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        return sharedPreferences.getString(keyValue, "");
    }

    /**
     * @param mContext
     */
    public static void removeAllSharedPreferences(Context mContext) {
        SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.clear().apply();
    }
0 голосов
/ 02 сентября 2013

Сначала объявите закрытый атрибут в вашем классе. В моем случае у меня есть класс BaseAdapter:

private final Context ctx;
private final Vector<Acto> actos;

public ActoAdaptador(Context ctx, Vector<Acto> as) {
    super();
    this.ctx = ctx;
    this.actos = as;
}

Затем, когда использовать SharedPreferences:

ctx.getSharedPreferences("com.joninazio.euskofest.UsingPreferences_preferences", Context.MODE_PRIVATE)

Этот способ работает для меня по крайней мере:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...