Question

I have added settings to my live wallpaper but they are not being applied when changed. I would greatly appreciate it if someone could tell me why my settings are not being applied when changed. Here is my code:

settings.xml

       <PreferenceCategory android:title="@string/more">
        <PreferenceScreen android:title="@string/more">
            <intent android:action="android.intent.action.VIEW" 
           android:data="market://search?q=pub:PSP Demo Center" />
         </PreferenceScreen>
         <ListPreference 
            android:persistent="true" 
            android:enabled="true" 
            android:entries="@array/settings_light_number_options" 
            android:title="@string/settings_light_number" 
            android:key="light_power" 
            android:summary="@string/settings_light_number_summary" 
            android:defaultValue="3" 
            android:entryValues="@array/settings_light_number_optionvalues" />
         <ListPreference 
            android:persistent="true" 
            android:enabled="false" 
            android:entries="@array/settings_speed_number_options" 
            android:title="@string/settings_speed_number" 
            android:key="speed" 
            android:summary="@string/settings_speed_number_summary" 
            android:defaultValue="10" 
            android:entryValues="@array/settings_speed_number_optionvalues" />  
        <ListPreference 
            android:persistent="true" 
            android:enabled="false" 
            android:entries="@array/settings_rotate_number_options" 
            android:title="@string/settings_rotate_number" 
            android:key="rotate" 
            android:summary="@string/settings_rotate_number_summary" 
            android:defaultValue="8000" 
            android:entryValues="@array/settings_rotate_number_optionvalues" />

    </PreferenceCategory>

</PreferenceScreen>

Settings.java

    public class GraffitiLWPSettings extends PreferenceActivity 
              implements SharedPreferences
              .OnSharedPreferenceChangeListener {
    public static final String SHARED_PREFS_NAME = "wallpaper_settings";


    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        getPreferenceManager().
            setSharedPreferencesName(GraffitiLWP.SHARED_PREFS_NAME);
        addPreferencesFromResource(R.xml.settings);
        getPreferenceManager().getSharedPreferences().
            registerOnSharedPreferenceChangeListener(this);
    }

    protected void onResume() {
        super.onResume();
    }

    protected void onDestroy() {
        getPreferenceManager().getSharedPreferences()
            .unregisterOnSharedPreferenceChangeListener(this);
        super.onDestroy();
    }

    public void onSharedPreferenceChanged(SharedPreferences 
            sharedPreferences, String key) {
    }
}

wallpaper.java

    public class GraffitiLWP extends Wallpaper {
    private GraffitiLWPRenderer mRenderer;
    public static final String SHARED_PREFS_NAME = "wallpaper_settings";
    public Engine onCreateEngine() {
        mRenderer = new GraffitiLWPRenderer(this);
        return new WallpaperEngine(
            this.getSharedPreferences(SHARED_PREFS_NAME,
        Context.MODE_PRIVATE), getBaseContext(), mRenderer);
    }
}

renderer.java

    public class GraffitiLWPRenderer extends RajawaliRenderer {
    private Animation3D mAnim;
    private BaseObject3D mCan;
    private SettingsUpdater settingsUpdater;
    //private SharedPreferences preferences;


    public GraffitiLWPRenderer(Context context) {
        super(context);
        setFrameRate(20);
    }

    public class SettingsUpdater implements SharedPreferences
             .OnSharedPreferenceChangeListener {
        private GraffitiLWPRenderer renderer;

        public SettingsUpdater(GraffitiLWPRenderer renderer)
        {
            this.renderer = renderer;
        }

        public void onSharedPreferenceChanged(
                SharedPreferences sharedPreferences, String key) {
            preferences.getInt("wallpaper_settings", 0);

            renderer.setSharedPreferences(preferences);
        }
    }

    public void initScene() {
        System.gc();
        ALight light = new DirectionalLight();
        light.setPower(this.preferences.getLong("light_power", 3));
        light.setPosition(0, 0, -10);
        mCamera.setPosition(0, -1, -7);
        mCamera.setLookAt(0, 2, 0);
        mCamera.setFarPlane(1000);

        ObjParser parser = new ObjParser(mContext
                    .getResources(), mTextureManager, R.raw.spraycan_obj);
        parser.parse();
        mCan = parser.getParsedObject();
        mCan.addLight(light);
        mCan.setScale(1.2f);
        addChild(mCan);

        Number3D axis = new Number3D(0, 
             this.preferences.getLong("speed", 10), 0);
        axis.normalize();
        mAnim = new RotateAnimation3D(axis, 360);
        mAnim.setDuration(this.preferences.getLong("rotate", 8000));
        mAnim.setRepeatCount(Animation3D.INFINITE);
        mAnim.setInterpolator(new AccelerateDecelerateInterpolator());
        mAnim.setTransformable3D(mCan);


        setSkybox(R.drawable.posz, R.drawable.posx, 
            R.drawable.negz, R.drawable.negx, R.drawable.posy, 
            R.drawable.negy);
    }
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        settingsUpdater = new SettingsUpdater(this);
        this.preferences.registerOnSharedPreferenceChangeListener(
            settingsUpdater);
        settingsUpdater.onSharedPreferenceChanged(preferences, null);
        super.onSurfaceCreated(gl, config);
        mAnim.start();          
    }

    public void onDrawFrame(GL10 glUnused) {
        super.onDrawFrame(glUnused);
        mSkybox.setRotY(mSkybox.getRotY() + .5f);           
    }
}

I know the code is long but I would greatly appreciate any help that someone could give me. Thank you.

Was it helpful?

Solution

You have the PreferenceScreen nested inside the PreferenceCategory.

-- EDIT -- On closer inspection, the tags are all mixed up. (You're closing the PreferenceScreen twice)

I believe the basic structure is:

   <PreferenceScreen android:title="@string/more">
     <PreferenceCategory android:title="@string/more">
       <ListPreference android:title="@string/settings_something"/>
     </PreferenceCategory>
   </PreferenceScreen>

Also, you have android:enabled="false" added to each preference. I can imagine this will disable the input...

OTHER TIPS

You need to change your wallpaper.java to:

public class GraffitiLWP extends Wallpaper 
        implements OnSharedPreferenceChangeListener{
   private GraffitiLWPRenderer mRenderer;
   public static final String SHARED_PREFS_NAME = "wallpaper_settings";
   private SharedPreferences prefs;

public Engine onCreateEngine() {
    mRenderer = new GraffitiLWPRenderer(this);
    prefs = getSharedPreferences(SHARED_PREFS_NAME, 0);
    prefs.registerOnSharedPreferenceChangeListener(this);

    return new WallpaperEngine(
        this.getSharedPreferences(SHARED_PREFS_NAME,
    Context.MODE_PRIVATE), getBaseContext(), mRenderer);
    }
}

Basically I just added implements OnSharedPreferenceChangeListener and

prefs = getSharedPreferences(SHARED_PREFS_NAME, 0); prefs.registerOnSharedPreferenceChangeListener(this);

I had the same issue with rajawali engine; or at least I though I had. I could go into preferences from preview, but I couldn´t when live wallpaper was selected and applied. What I did: I changed the manifest this way (where you declare the preferences activity):

<activity
    android:label="@string/settings"
    android:name="com.onebutton.livewallpaper.budastatuefree.BudaStatueFreeSettings"
    android:theme="@android:style/Theme.Light.WallpaperSettings"
    android:exported="true">
</activity>

Of course you have to change the activity name

Hope this works for you...

Don't over complicate things if you don't need to. All you need is a function like this in your renderer:

private void setOnPreferenceChange(){
    mListener = new OnSharedPreferenceChangeListener(){
        public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
            if ("cool_pref".equals(key))
            {
                camSpeed = Integer.parseInt(sharedPreferences.getString(key, "default"));
            } 
            preferences = sharedPreferences;
        }
    };      
}

Call the function in initScene, and you'll be ready to go.

I also do this to grab the preferences on each initScene too:

private void setPrefsToLocal(){
    localPrefVar= Integer.parseInt(preferences.getString("cool_pref", "default"));
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top