Intereting Posts
Android и отображение многострочного текста в TextView в TableRow Автообновление google play Должен ли я использовать android LocationManager.getBestProvider каждый раз, когда я запрашиваю обновления местоположения? Android: обновление галереи после сохранения новых изображений Загрузка файлов в WebView Вызывается onCreate при создании объекта Activity? Настройка значка setError для TextView Как обрабатывать AsyncTask во время вращения экрана? Получить общее значение общих настроек Android в действии / нормальном классе Отключение полноэкранного редактирования для ввода мягкой клавиатуры в альбомной ориентации? Android: лучше ли начинать и останавливать службу каждый раз, когда это необходимо, или разрешить запуск и привязку службы и привязать ее к ней? Android: изменить цвет отключенного текста с помощью темы / стиля? Как стилизовать текст в меню переполнения действий на устройстве с Android> 4.0 и аппаратной кнопкой? В чем разница между @id и @ + id? Можно ли программно удалить пакет на Android?

Есть ли способ сделать SharedPreferences глобальным во всем моем приложении для Android?

Есть ли способ сделать SharedPreferences глобальным во всем моем приложении? Сейчас я использую эти строки во многих местах всего кода, чтобы хранить простые настройки включения / выключения для ряда настроек, которые могут быть установлены моими пользователями. Я просто хочу назвать их когда-нибудь глобально, если это возможно:

SharedPreferences settings = getSharedPreferences("prefs", 0); SharedPreferences.Editor editor = settings.edit(); 

Любые советы о том, как можно назвать только эту строку во всех классах, были бы удивительными:

 editor.putString("examplesetting", "off"); editor.commit(); 

а также

 String checkedSetting = settings.getString("examplesetting", ""); 

Solutions Collecting From Web of "Есть ли способ сделать SharedPreferences глобальным во всем моем приложении для Android?"

Я знаю, я знаю, я буду воспален и брошен в уголки ада ….

Используйте одноэлементный класс, который SharedPreference настройки SharedPreference .. что-то вроде этого:

 public class PrefSingleton{ private static PrefSingleton mInstance; private Context mContext; // private SharedPreferences mMyPreferences; private PrefSingleton(){ } public static PrefSingleton getInstance(){ if (mInstance == null) mInstance = new PrefSingleton(); return mInstance; } public void Initialize(Context ctxt){ mContext = ctxt; // mMyPreferences = PreferenceManager.getDefaultSharedPreferences(mContext); } } 

И создайте функции-обертки вокруг того, что ваши примеры представлены в вопросе, например,

PrefSingleton.getInstance().writePreference("exampleSetting", "off");

И реализация может быть примерно такой:

 // Within Singleton class public void writePreference(String key, String value){ Editor e = mMyPreference.edit(); e.putString(key, value); e.commit(); } 

С вашего первого действия активируйте класс singleton таким образом:

 PrefSingleton.getInstance().Initialize(getApplicationContext()); 

Причина, по которой я рискую голосом, – использовать глобальные статические классы, может быть плохой идеей и идет вразрез с практикой программирования. НО , сказав, что, как ничтожный в сторону, он обеспечит только один и единственный объект класса PrefSingleton может существовать и быть доступным независимо от того, в каких действиях находится код.

Я бы расширил Application и включил SharedPreferences.Editor в качестве поля с SharedPreferences.Editor .

 public class APP extends Application { private final SharedPreferences settings = getSharedPreferences("prefs", 0); private final SharedPreferences.Editor editor = settings.edit(); public SharedPreferences.Editor editSharePrefs() { return editor; } } 

Затем вы можете получить к нему доступ из любой

 ((APP) getApplication()).editSharePrefs().putString("examplesetting", "off"); ((APP) getApplication()).editsharePrefs().commit(); 

В качестве альтернативы вы также можете использовать метод

  public static APP getAPP(Context context) { return (APP) context.getApplicationContext(); } 

Хотя это просто изменит ваши вызовы

 APP.getAPP(this).editSharePrefs().putString("examplesetting", "off"); APP.getAPP(this).editsharePrefs().commit(); 

Так что это действительно личное предпочтение, которое выглядит более чистым для вас.

Я бы сделал следующее:

 public class BaseActivity extends Activity { protected boolean setInHistory; protected SharedPreferences sharedPrefs; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); setInHistory = true; } } public class MainActivity extends BaseActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); System.out.println(setInHistory+" <-- setInhistory"); } } 

Затем можно получить доступ к sharedPrefs, потому что он защищен, а затем доступен через пакет.

 In the console you have : true <-- setInhistory 

Используйте класс Helper, чтобы получить все, что хотите, сделать методы static.This, как ADW ​​делать.

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

 public static void SetCheckedSetting(Context context, String value) { SharedPreferences settings = getSharedPreferences("prefs", 0); SharedPreferences.Editor editor = settings.edit(); editor.putString("examplesetting", value); editor.commit(); } 

И чтобы получить настройку:

 public static String GetCheckedSetting(Context context) { SharedPreferences settings = getSharedPreferences("prefs", 0); return settings.getString("examplesetting", ""); } 

Чтобы передать контекст, вы можете просто использовать this ключевое слово.

Важно, чтобы вы не SharedPreferences как статическую переменную. Если вы это сделаете, это приведет к утечке памяти. См .: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html