SharedPreferences更改未在我的壁纸服务中反映

5

我正在制作一个动态壁纸,在设置场景中需要更改车辆的速度,并在按下返回按钮时将其反映回壁纸服务。在我的首选活动中,我将列表首选项更改保存在共享首选项中:

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

    });

我的壁纸服务是使用AndEngine LiveWallpaper扩展程序制作的。如果我想在服务中反映出列表首选项的更改,我该怎么做?这是我的尝试,但似乎不起作用。
我的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);
}

但是我在ListPreference中更改的值并没有在我的服务中得到更改。我做错了什么吗?
2个回答

1

问题已解决!

我在我的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);
}

0
一些事情: 你的XML文件中写着你的键是"listPref",所以当你从首选项中读取值时,你需要检查这个键(Speed只是显示标题)。
我不确定偏好更改监听器是否有用... 我建议的方式是,在onResume()中读取首选项中的新值并使用它。每次在更改首选项后返回应用程序时,这应该可以正常工作,并调用onResume()。

嘿,感谢您的回答,但问题在于当服务首次启动时,onResume()会首先被调用,而onPopulateScene()则会创建fltSpeedValue值的空指针。 - Swati Rawat
我不确定我理解了。你是说如果你的onResume从首选项中提取速度,你不能在场景上设置它,因为场景还没有被创建吗?如果是这样,为什么不在onPopulateScene函数中直接从首选项中提取值呢?如果场景已经被创建,你也可以在onResume中提取它,但如果场景还没有被创建,就忽略它。 - Peter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接