2012-01-22 172 views
0

我做壁紙andoid,我希望用戶可以選擇選項。顯示帶選項的菜單,但有問題。當我點擊任何選項並回到壁紙屏幕時,他們不會更新新的選項。爲什麼? 我的代碼WallpaperService:android壁紙OnSharedPreferenceChangeListener

public MyWallpaperEngine(WallpaperService ws) 
    { 
     context = ws; 
     prefs = LiveWallpaperService.this.getSharedPreferences(SHARED_PREFS_NAME, 0); 

     OnSharedPreferenceChangeListener listener 
     = new SharedPreferences.OnSharedPreferenceChangeListener() { 
      public void onSharedPreferenceChanged(SharedPreferences prefs, String key) 
      { 
       if(key != null){ 
        if(key.equals("BACKREPEAT")){ 
         if(BACKREPEAT) 
          BACKREPEAT = false; 
         else 
          BACKREPEAT = true; 
        } 
       } 
      } 
     }; 
     prefs.registerOnSharedPreferenceChangeListener(listener); 

     handler.post(drawRunner); 
    } 

UPD: 我發了,因爲是寫在一個例子,但結果並沒有改變.. LiveWallpaperService代碼:

package com.samples; 

import android.content.SharedPreferences; 
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.drawable.BitmapDrawable; 
import android.graphics.drawable.Drawable; 
import android.os.Handler; 
import android.preference.PreferenceManager; 
import android.service.wallpaper.WallpaperService; 
import android.util.Log; 
import android.view.SurfaceHolder; 

public class LiveWallpaperService extends WallpaperService 
{ 
    public static final String SHARED_PREFS_NAME = "leoSettings01"; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
    } 

    @Override 
    public Engine onCreateEngine() { 
     return new MyWallpaperEngine(); 
    } 

    private class MyWallpaperEngine extends Engine implements 
    SharedPreferences.OnSharedPreferenceChangeListener { 

     private final Handler handler = new Handler(); 

     int draw_x = 0; 
     int draw_y = 0; 
     //... 

     boolean BACKREPEAT = false; 

     private final Runnable drawRunner = new Runnable() { 
      @Override 
      public void run() 
      { 
       draw(); 
      } 
     }; 

     private boolean visible = true; 
     private SharedPreferences prefs; 

     MyWallpaperEngine() 
     { 
      prefs = LiveWallpaperService.this.getSharedPreferences(SHARED_PREFS_NAME, 0); 

      prefs.registerOnSharedPreferenceChangeListener(this); 
      onSharedPreferenceChanged(prefs, null); 

      handler.post(drawRunner); 
     } 
     public void onSharedPreferenceChanged(SharedPreferences prefs, String key) { 
      if(key != null) 
      { 
       Log.v("key:", key); //no message! 

       if(key.equals("BACKREPEAT")){ 
        if(BACKREPEAT) 
         BACKREPEAT = false; 
        else 
         BACKREPEAT = true; 
       } 
      } 
     } 
     @Override 
     public void onVisibilityChanged(boolean visible) { 
      this.visible = visible; 
      if (visible) { 
      handler.post(drawRunner); 
      } else { 
      handler.removeCallbacks(drawRunner); 
      } 
     } 
     @Override 
     public void onSurfaceDestroyed(SurfaceHolder holder) { 
      super.onSurfaceDestroyed(holder); 
      this.visible = false; 
      handler.removeCallbacks(drawRunner); 
     } 

     private void draw() 
     { 
      SurfaceHolder holder = getSurfaceHolder(); 
      Canvas canvas = null; 

      try 
      { 
       canvas = holder.lockCanvas(); 
       //...draw draw draw 
      } 
      finally 
      { 
       if (canvas != null) 
         holder.unlockCanvasAndPost(canvas); 
      } 
      handler.removeCallbacks(drawRunner); 
      if (visible) 
      { 
       handler.postDelayed(drawRunner, DELAY); 
      } 
     } 
    } 
} 

首選項。 xml:

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
     <PreferenceCategory android:title="General"> 
       <CheckBoxPreference 
         android:title="Animation repeat" 
         android:key="BACKREPEAT" 
         android:defaultValue="false" 
       /> 
     </PreferenceCategory> 
</PreferenceScreen> 
+0

我只是想知道你應該使用PreferenceManager.getDefaultSharedPreferences(..)提供的首選項嗎?您也可以將許多初始化代碼轉換爲onCreate(..)方法。 – harism

+0

是的,但如果用戶點擊任何選項,壁紙不能重新啓動。所以我應該設置OnSharedPreferenceChangeListener ..但是這不起作用! – Leo

回答

3

你的壁紙將永遠不會重新啓動後從設置返回。唯一調用的方法是您的引擎的onVisibilityChanged。如果您的引擎上正確使用了SharedPreferences.OnSharedPreferenceChangeListener,則應調用onSharedPreferenceChanged

請檢查您是否實現OnSharedPreferenceChangeListener正是這樣: http://developer.android.com/resources/samples/CubeLiveWallpaper/src/com/example/android/livecubes/cube2/CubeWallpaper2.html

如果你沒有和它仍然不能正常工作,請在這裏發表您的整個WallpaperService和設置偏好活動代碼。

+0

我已添加代碼! – Leo

+0

註冊並收聽似乎沒問題。你需要檢查你的作品。在您的PreferenceActivity上,您是否在加載xml資源之前設置了您的sharedpreferences名稱? getPreferenceManager()。setSharedPreferencesName(LiveWallpaperService.SHARED_PREFS_NAME) –