Изменения SharedPreference не отражены в моей службе обоев

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

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.prefs); ListPreference listPreference = (ListPreference) findPreference("listPref"); currValue = listPreference.getValue(); Log.e("LiveWallpaperSettings", "currvalue " + currValue); listPreference.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { @Override public boolean onPreferenceChange(Preference arg0, Object arg1) { SharedPreferences customSharedPreference = getSharedPreferences("Speed", LiveWallpaperSettings.MODE_PRIVATE); SharedPreferences.Editor editor = customSharedPreference.edit(); editor.putString("Speed",currValue); editor.commit(); return true; } }); 

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

Мой prefs.xml

  <PreferenceCategory android:title="Settings"> <ListPreference android:title="Speed" android:summary="Change the Speed" android:key="listPref" android:defaultValue="15" android:entries="@array/listArray" android:entryValues="@array/listValues" /> </PreferenceCategory> 

Мой массив.xml

 <resources> <string-array name = "listArray"> <item>Slow</item> <item>Medium</item> <item>Fast</item> </string-array> <string-array name = "listValues"> <item>5</item> <item>15</item> <item>30</item> </string-array> 

В моей службе я реализую SharedPreferences.OnSharedPreferenceChangeListener и реализую следующий метод

 public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,String key) { sharedPreferences = getSharedPreferences("Speed", MODE_PRIVATE); strSpeedValue = sharedPreferences.getString("Speed", "5"); fltSpeedValue = Integer.parseInt(strSpeedValue); final AutoParallaxBackground autoParallaxBackground = new AutoParallaxBackground(0, 0, 0, 10); autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(fltSpeedValue, new Sprite(0,mCamera.getHeight() - this.mParallaxLayer.getHeight(),this.mParallaxLayer, getVertexBufferObjectManager()))); autoParallaxBackground.attachParallaxEntity(new ParallaxEntity(0f, new Sprite(CAMERA_WIDTH/2 - 30, CAMERA_HEIGHT/2,this.mAutoLayer, getVertexBufferObjectManager()))); mMainScene.setBackground(autoParallaxBackground); } @Override protected void onResume() { super.onResume(); // Set up a listener whenever a key changes PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); // Unregister the listener whenever a key changes PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(this); } 

Но значение, которое я изменяю в своем списке, не изменяется в моем сервисе. Я делаю что-то неправильно?

Решено!

Я неправильно задавал значения в моей PreferenceActivity, и я не правильно использовал OnSharedPreferenceChangeListener.

Решение :-

  ListPreference listPreference; @SuppressWarnings("deprecation") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); addPreferencesFromResource(R.xml.prefs); listPreference = (ListPreference) findPreference("listPref"); } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { SharedPreferences customSharedPreference = getSharedPreferences(key, LiveWallpaperSettings.MODE_PRIVATE); SharedPreferences.Editor editor = customSharedPreference.edit(); editor.putString("Speed",listPreference.getValue()); editor.commit(); Log.e("LiveWallpaperSettings", "Speed Value after setting " + customSharedPreference.getString("Speed", "")); } @Override protected void onResume() { super.onResume(); // Set up a listener whenever a key changes getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this); } @Override protected void onPause() { super.onPause(); // Unregister the listener whenever a key changes getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this); } 

Несколько вещей: ваш XML говорит, что ваш ключ «listPref», поэтому, когда вы читаете значение из префов, вы хотите проверить этот ключ (скорость – это только название экрана)

Я не уверен, что предпочтение изменено слушателем полезно … То, что я хотел бы предложить, заключается в том, что в вашем onResume () вы будете читать новое значение из настроек и использовать это значение. Это должно работать нормально, так как каждый раз, когда вы возвращаетесь к своему приложению после изменения предпочтений, следует вызывать onResume ().

Intereting Posts
Разница между `focusable` и` clickable` Настройка интеграционных тестов в Android-проекте на базе Gradle Уведомления стека в Kitkat (API 19) с использованием setGroup () не работают Как использовать аннотации Android и его обработчик аннотации с гнездом? Контролируемый элемент меню панели действий не работает / отображается правильно? Android: почему моментальные снимки и gpu являются взаимоисключающими? Android OpenGL ES 2, рисовые квадраты Проблемы с внедрением пользовательского сервиса с использованием Roboguice Kotlin Kapt не показывает ошибки привязки данных при работе с Android Studio Почему мои намерения не доставлены правильно? Завершение выполнения задания пользовательского интерфейса Не удалось найти класс 'android.widget.ThemedSpinnerAdapter' Как получить 7 и 10-дюймовые планшетные эмуляторы? Как программно проверить, объявлена ​​ли служба в AndroidManifest.xml? Обратный отсчет при показе дней в часах минут секунд с использованием таймера обратного отсчета в андроиде