2012-01-22 19 views
0

私は壁紙をアンドロイドにして、ユーザーがオプションを選択できるようにしたい。オプション付きメニューは表示されていますが、問題があります。オプションをクリックして壁紙画面に戻ると、新しいオプションで更新されません。どうして? 私のコードWallpaperService:アンドロイドの壁紙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); 
      } 
     } 
    } 
} 

のprefs。 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

登録とリスニングはOKと思われます。あなたはあなたの文章をチェックする必要があります。 PreferenceActivityで、xmlリソースをロードする前にsharedpreferencesの名前を設定していますか? getPreferenceManager()。setSharedPreferencesName(LiveWallpaperService.SHARED_PREFS_NAME) –