как лучше всего использовать общие настройки между действиями

У меня есть пользовательские предпочтения в моем приложении, которые используются различными действиями. Я хотел бы знать, как лучше всего использовать эти предпочтения между различными действиями в моем приложении.

У меня есть идея создать объект общих предпочтений из основного действия и оттуда отправлять намерения различным действиям для выполнения действий. Это сработает...?

Или просто продолжать звонить getsharedpreferences() из каждой активности..?

Спасибо.


person irobotxx    schedule 29.10.2010    source источник


Ответы (4)


Отправка общих настроек через намерения кажется чрезмерно сложной. Вы можете обернуть общие настройки чем-то вроде приведенного ниже и вызывать методы непосредственно из своих действий:

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();
    }
}
person fornwall    schedule 29.10.2010
comment
хм.. слишком много вариантов здесь. но на самом деле мои пользовательские настройки содержат флажки, которые выполняют действие в списке. так что я мог бы пойти с предложениями здесь. Единственная проблема в том, что он заполняется из customCursorAdapter, поэтому нужно понять, где его вызывать. - person irobotxx; 29.10.2010
comment
да .. это работает, я бы действительно выстрелил себе в ногу, если бы я прошел маршрут намерения! - person irobotxx; 29.10.2010
comment
Сталкивались ли вы с проблемой производительности при использовании этого подхода? потому что я использую тот же подход, и у меня проблемы с производительностью, но я не уверен, что этот подход является причиной проблемы - person AlAsiri; 07.01.2013
comment
Если у вас много префов, вы захотите их объединить. Если вы нацелены на Android 2.3 или новее, вам, вероятно, следует использовать неблокирующий метод apply() вместо commit() - developer.android.com/reference/android/content/. - person fornwall; 07.01.2013
comment
Почему бы вам просто не объявить весь класс как static? - person Fred; 02.02.2014

Вы можете использовать этот способ и объявлять одни и те же переменные с одинаковыми именами во всех действиях, где вы хотите их использовать.

  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); 

  }

Здесь изначально wordCount даст 4; И когда вы редактируете wordCount и хотите сохранить снова

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

Вы должны объявить эти же переменные в действиях, где вы хотите использовать общие настройки. И лучше вызывать getSharedPreferences в каждом действии.

Я не думаю, что передача этого предпочтения в намерении сработает.

person krunal shah    schedule 29.10.2010

Конечно, вы можете использовать общие настройки в своих приложениях.

Если у вас есть более простой тип, чем string или int, вы можете использовать singleton или расширить класс приложения, который будет доступен для всех действий вашего приложения. => Здесь нет доступа к диску. Просто сохранили в памяти.

person William Remacle    schedule 29.10.2010

Вот хорошее и простое решение в Kotlin: просто скопируйте и вставьте код в новый файл AppPreferences.kt и выполните 4 шага TODO, описанные в код:

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) }
    }
}
person Jeehut    schedule 05.01.2020
comment
почему вы не использовали commit() или appyl()? - person Kuvonchbek Yakubov; 17.06.2020
comment
@KuvonchbekYakubov Хороший вопрос, не помню. Вероятно, это работало так, но, может быть, это неправильно? Не стесняйтесь сообщать или предоставлять исправленную версию (например, через GitHub Gists), и я обновлю свой ответ! :) - person Jeehut; 18.06.2020