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?
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);
}
}
}
Quelqu'un peut-il m'aider avec ceci? –
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. –
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 !!! –