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

    });

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

Мой 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>

Мой array.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);
}

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

Ответы на вопрос(2)

Решение Вопроса

Я неправильно устанавливал значения в моей 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», поэтому, когда вы читаете значение из prefs, вы хотите проверить этот ключ (скорость - это просто отображаемое название)

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

 Swati Rawat15 окт. 2012 г., 08:34
эй, спасибо за ответ, но проблема в том, что onResume () вызывается первым, когда служба сначала запускается перед onPopulateScene (), что создаст нулевой указатель для значения fltSpeedValue.
 Peter Carpenter16 окт. 2012 г., 01:26
Я не уверен, что понимаю. Вы говорите, что если ваш onResume извлекает скорость из настроек, вы не можете установить ее на своей сцене, потому что сцена еще не была создана? Если так, то почему бы вам просто не извлечь значение из настроек в вашей функции onPopulateScene? Вы также можете сделать это из onResume, если сцена уже создана, но проигнорируйте ее, если нет.

Ваш ответ на вопрос