0

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

设置.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>

设置.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) {
    }
}

壁纸.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);
    }
}

渲染器.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

4 回答 4

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"添加到每个首选项。我可以想象这将禁用输入...

于 2012-10-18T02:48:23.587 回答
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);

于 2012-09-28T07:17:00.947 回答
0

我对 rajawali 引擎也有同样的问题;或者至少我有。I could go into preferences from preview, but I couldn´t when live wallpaper was selected and applied. 我做了什么:我以这种方式更改了清单(您在其中声明了首选项活动):

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

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

希望这对你有用...

于 2012-10-06T22:14:46.310 回答
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"));
}
于 2013-01-21T18:19:27.283 回答