动态壁纸设置不适用

时间:2012-06-03 07:06:25

标签: android settings live-wallpaper rajawali

我已将设置添加到我的动态壁纸中,但更改时未应用这些设置。如果有人能告诉我为什么我的设置在更改时没有被应用,我将不胜感激。这是我的代码:

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

我知道代码很长但我非常感谢有人能给我的任何帮助。谢谢。

4 个答案:

答案 0 :(得分:1)

您将PreferenceScreen嵌套在PreferenceCategory中。

- 编辑 - 经过仔细检查,标签全部混淆了。 (您正在关闭PreferenceScreen两次)

我认为基本结构是:

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

此外,您为每个偏好添加了android:enabled="false"。 我可以想象这会禁用输入......

答案 1 :(得分:0)

您需要将wallpaper.java更改为:

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

基本上我刚添加implements OnSharedPreferenceChangeListener

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

答案 2 :(得分:0)

我和rajawali引擎有同样的问题;或者至少我虽然有。 我可以从预览中进入偏好,但是当选择并应用动态壁纸时我无法进行。 我做了什么:我以这种方式改变了清单(你宣布了偏好活动):

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

当然,您必须更改活动名称

希望这对你有用......

答案 3 :(得分:0)

如果您不需要,请不要过于复杂。您只需要在渲染器中使用这样的函数:

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

在initScene中调用该函数,您就可以开始了。

我也是这样做来获取每个initScene的首选项:

private void setPrefsToLocal(){
    localPrefVar= Integer.parseInt(preferences.getString("cool_pref", "default"));
}