2 votes

Implémenter CountDownTimer dans un AppWidgetProvider

Je veux implémenter un CountDownTimer dans un widget. Voici ce que j'ai trouvé :

import android.content.Intent;
import android.os.CountDownTimer;
import android.widget.RemoteViews;
import android.widget.TextView;

public class CountDown extends CountDownTimer {
    private RemoteViews views;

    public CountDown(long millisInFuture, int countDownInterval, RemoteViews views) {
        super(millisInFuture, countDownInterval);

        this.views = views;
    }

    @Override
    public void onFinish() {
    }

    @Override
    public void onTick(long millisUntilFinished) {
        int days = (int) (millisUntilFinished / (1000 * 60 * 60 * 24));

            views.setTextViewText(R.id.countWidget, days);
    }
}

Et la classe AppWidgetProvider

import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.TextView;

public class CountDownWidgetProvider extends AppWidgetProvider {
    private Calendar currentDate = Calendar.getInstance();
    private Calendar firstDecember = Calendar.getInstance();

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        Date date = new Date();

        this.firstDecember.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
        this.currentDate.setTimeZone(TimeZone.getTimeZone("Europe/Berlin"));
        this.firstDecember.set(2012, 11, 1, 0, 0, 0); // TODO: Set to December
        this.currentDate.setTime(date);

        final int N = appWidgetIds.length;

        // Perform this loop procedure for each App Widget that belongs to this provider
        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            // Create an Intent to launch MainActivity
            Intent intent = new Intent(context, MainActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);

            // Get the layout for the App Widget and attach an on-click listener
            // to the button
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.count_down_app_widget);
            views.setOnClickPendingIntent(R.id.countWidget, pendingIntent);

            long millis = this.firstDecember.getTimeInMillis() - this.currentDate.getTimeInMillis();

            CountDown countDown = new CountDown(millis, 1000, views);
            countDown.start();

            // Tell the AppWidgetManager to perform an update on the current app widget
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

Mais cela ne fonctionne pas de cette façon. Le widget TextView ne se rafraîchit pas et ne change même pas. Il semble que le CountDown ne démarre pas.

J'ai peut-être fait une erreur quelque part, mais je suis novice en matière de développement Android, alors j'ai pensé que vous pourriez m'aider.

2voto

Ketan Ahir Points 3751
you have to update widget after setting the text
use 
 appWidgetManager.updateAppWidget(appWidgetId, views);

 after
  views.setTextViewText(R.id.countWidget, days);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X