Android 更改设置后更新实时壁纸

Android 更改设置后更新实时壁纸,android,andengine,live-wallpaper,Android,Andengine,Live Wallpaper,我正在用andengine创建一个动态壁纸。我的项目有两个类 public class LiveWallpaperMain extends BaseLiveWallpaperService implements SharedPreferences.OnSharedPreferenceChangeListener { //Other methods public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallbac

我正在用andengine创建一个动态壁纸。我的项目有两个类

public class LiveWallpaperMain extends BaseLiveWallpaperService implements SharedPreferences.OnSharedPreferenceChangeListener
{

//Other methods

    public void onCreateScene(OnCreateSceneCallback pOnCreateSceneCallback)
            throws Exception {
        // TODO Auto-generated method stub
        this.mEngine.registerUpdateHandler(new FPSLogger());
        scene = new Scene();


        if(snowDensity == 5)
            snowDensityValue = 50;
        else if(snowDensity == 10)
            snowDensityValue = 200;
        else
            snowDensityValue = 500;
        particleSystem = new BatchedPseudoSpriteParticleSystem(
                new RectangleParticleEmitter(CAMERA_WIDTH / 2, 0, CAMERA_WIDTH, CAMERA_HEIGHT),
                2, 5, snowDensityValue, mSnowParticleRegion, vbom);
        particleSystem.setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE);
        particleSystem.addParticleInitializer(new VelocityParticleInitializer<Entity>(-3, 3, 20, 40));
        particleSystem.addParticleInitializer(new AccelerationParticleInitializer<Entity>(-3, 3, 3, 5));
        particleSystem.addParticleInitializer(new RotationParticleInitializer<Entity>(0.0f, 360.0f));
        particleSystem.addParticleInitializer(new org.andengine.entity.particle.modifier.ExpireParticleInitializer<Entity>(15f));
        particleSystem.addParticleInitializer(new ScaleParticleInitializer<Entity>(0.5f, 0.9f));
        particleSystem.addParticleInitializer(new RegisterXSwingEntityModifierInitializer<Entity>(15f, 0f, (float) Math.PI * 8, 3f, 25f, true));

        particleSystem.addParticleModifier(new AlphaParticleModifier<Entity>(10f, 15f, 1.0f, 0.0f));
    Log.e("LiveWallpaperSettings", "Density " + snowDensityValue);



    pOnCreateSceneCallback.onCreateSceneFinished(scene);
}

我想在设置中更改雪密度时更改它。当我更改设置时,它会在SharedReferences中更改,但如何刷新粒子系统以使更改立即反映在那里?

首先,您不需要在LiveWallperSettings类中实现OnSharedPreferenceChangeListener。若在xml文件中正确定义了首选项键,则会自动存储值。您的类应该如下所示:

public class LiveWallpaperSettings extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        getPreferenceManager().setSharedPreferencesName("shared-preference-file-name");
        addPreferencesFromResource(R.xml.settings); // this is xml with PreferenceScreen element
    }
}
   public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if ("snow-density-key-name-from-xml".equals(key)) {
            // here call the method to update snow density
        }
   }
在LiveWallperMain类中实现OnSharedPreferenceChangeListener。实现应该如下所示:

public class LiveWallpaperSettings extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        getPreferenceManager().setSharedPreferencesName("shared-preference-file-name");
        addPreferencesFromResource(R.xml.settings); // this is xml with PreferenceScreen element
    }
}
   public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        if ("snow-density-key-name-from-xml".equals(key)) {
            // here call the method to update snow density
        }
   }

为粒子效果创建一个方法,并在从该屏幕发出时立即调用此方法。代码示例将更有帮助。我在主类中使用了SharedPreferenceChanged(..)方法,但从未调用过它。设置类的onSharedPreferenceChanged方法在每次我更改某些内容时都会被调用。知道为什么吗?当然知道。您可能尚未将LiveWallperMain注册为onSharedPreferenceChanged侦听器。确保通过调用context.getSharedReferences(“共享首选项文件名”,context.MODE\u PRIVATE)注册它。RegisterOnSharedReferenceChangeListener(LiveWallperMainObject);是的,这就是问题所在,现在已经解决了。谢谢大家的帮助。