3

Je crée un fond d'écran en direct et j'utilise ce tutoriel comme point de départ:Comment redémarrer ce moteur de fond d'écran après la mise à jour des paramètres?

http://code.tutsplus.com/tutorials/create-a-live-wallpaper-on-android-using-an-animated-gif--cms-23088

Je suis en train d'ajouter un menu paramètres pour permettre à l'utilisateur de choisir l'un des quatre milieux. J'ai tout fonctionnant en utilisant SharedPreferences. Le seul problème est que le fond d'écran ne se met pas à jour après que le réglage a été modifié dans le menu des paramètres. Si vous redémarrez l'application, l'arrière-plan sera mis à jour avec le dernier arrière-plan sélectionné, mais cela ne fonctionne qu'après le redémarrage du papier peint (c.-à-d., Sélection d'un fond d'écran différent, puis resélection de ce fond d'écran). J'ai réduit le problème au fait que la valeur de SharedPreference est seulement mise à jour dans la méthode onCreateEngine(). Une fois que le service de papier peint est en cours d'exécution, la méthode onCreateEngine() n'est pas appelée, donc même si la valeur du SharedPreference a été modifiée, elle n'est pas mise à jour dans le service de papier peint.

Ma question est comment redémarrer le fond d'écran de sorte que la méthode onCreateEngine() soit appelée après un changement de paramètre? Encore une fois, les SharedPreferences fonctionnent, puisque tout fonctionne après le redémarrage. Je sais que je dois utiliser la méthode onsharedPreferenceChanged, mais je ne suis pas sûr où cela devrait se produire, ou quel code devrait être inclus dans cette méthode pour redémarrer le moteur de fond d'écran.

Voici l'exemple de code. Le mien est le même, sauf indication contraire par les commentaires:

import android.graphics.Canvas; 
    import android.graphics.Movie; 
    import android.os.Handler; 
    import android.service.wallpaper.WallpaperService; 
    import android.util.Log; 
    import android.view.SurfaceHolder; 

    import java.io.IOException; 

    public class GIFWallpaperService extends WallpaperService implements onsharedpreferencechangelistener { 

     // Variable I added to change background 
     String mBackgroundImage = null; 

     // Method I added to update background image 
     public void updatedBackgroundImage(){ 
      // code that sets mBackgroundImage based upon value of shared preference file. 
     } 

     @Override 
     public WallpaperService.Engine onCreateEngine() { 

      // I call this method to change the value of mBackgroundImage 
      updateBackgroundImage(); 

      try { 
       Movie movie = Movie.decodeStream(
         getResources().getAssets().open("mBackgroundImage")); 

       return new GIFWallpaperEngine(movie); 
      }catch(IOException e){ 
       Log.d("GIF", "Could not load asset"); 
       return null; 
      } 
     } 

     @Override 
     public void onSharedPreferenceChanged(SharedPreferences sp, String key) { 
    // What do I do? How do I make the wallpaper engine restart when settings are changed? 
     } 

     private class GIFWallpaperEngine extends WallpaperService.Engine { 

      private final int frameDuration = 20; 

      private SurfaceHolder holder; 
      private Movie movie; 
      private boolean visible; 
      private Handler handler; 

      public GIFWallpaperEngine(Movie movie) { 
       this.movie = movie; 
       handler = new Handler(); 
      } 

      @Override 
      public void onCreate(SurfaceHolder surfaceHolder) { 
       super.onCreate(surfaceHolder); 
       this.holder = surfaceHolder; 
      } 

      private Runnable drawGIF = new Runnable() { 
       public void run() { 
        draw(); 
       } 
      }; 


      private void draw() { 
       if (visible) { 
        Canvas canvas = holder.lockCanvas(); 
        canvas.save(); 
         // Adjust size and position so that 
         // the image looks good on your screen 
         canvas.scale(3f, 3f); 
         movie.draw(canvas, -100, 0); 
        canvas.restore(); 
        holder.unlockCanvasAndPost(canvas); 
        movie.setTime((int) (System.currentTimeMillis() % movie.duration())); 

        handler.removeCallbacks(drawGIF); 
        handler.postDelayed(drawGIF, frameDuration); 
       } 
      } 

      @Override 
      public void onVisibilityChanged(boolean visible) { 
       this.visible = visible; 
       if (visible) { 
        handler.post(drawGIF); 
       } else { 
        handler.removeCallbacks(drawGIF); 
       } 
      } 

      @Override 
      public void onDestroy() { 
       super.onDestroy(); 
       handler.removeCallbacks(drawGIF); 
      } 
     } 
    } 
+0

Quelqu'un peut-il m'aider avec ceci? –

+0

Après avoir continué à jouer avec cela, je pense que le problème est que 'onSharedPreferenceChange()' n'est pas appelé lorsque la modification se produit. J'essaie de comprendre pourquoi. –

+0

Très bien, j'ai résolu le problème avec 'onSharedPreferenceChange()' ne pas être appelé. Il est maintenant appelé à partir de 'WallpaperService', mais je ne sais pas quoi mettre dans l'implémentation. Tout fonctionne correctement lorsque le 'Service' commence d'abord ... et la variable qui définit l'image d'arrière-plan est mise à jour en fonction de ce que l'utilisateur sélectionne dans le menu, mais parce que' Service' est déjà en cours, la variable mise à jour n'a aucun effet . S'IL VOUS PLAÎT AIDE !!! –

Répondre

-1

Je ne sais pas si vous avez trouvé votre réponse, mais je l'ai vu cela dans le ref android:

WallpaperService.Engine onCreateEngine()

Doit être implémenté pour renvoyer une nouvelle instance du moteur du fond d'écran. Notez que plusieurs instances peuvent être actives en même temps, par exemple lorsque le fond d'écran est actuellement défini comme fond d'écran actif et que l'utilisateur se trouve dans le sélecteur de papier peint, en affichant également un aperçu de celui-ci.

chris

1

Je suis propably tard, mais espère que quelqu'un trouvera ce utile.

Vous devez d'abord spécifier et vous enregistrer en tant que SharedPrefs. Ajoutez ceci à votre méthode onCreate().

SharedPreferences preferences = getSharedPreferences("PREFERENCES NAME", Context.MODE_PRIVATE); 
     preferences.registerOnSharedPreferenceChangeListener(this);