Android-виджет не будет обновляться

Я работал над виджетом для Android. Одна из вещей, которую он должен сделать, это отобразить текущий день недели и день месяца. Я думаю, что мой код в порядке, но по какой-то причине он никогда не обновляется. Период обновления в моем провайдере установлен на 30 минут, но я не думаю, что это должно иметь значение (во всяком случае, я пытался установить его на 1 секунду, и это ничего не изменило). Кроме того, если я заставлю его печатать значения для текущего дня недели и дня месяца в LogCat, он будет работать нормально, поэтому я действительно не знаю, почему он не обновляется. Пожалуйста, помогите мне! Это мой код:

public class Henk extends AppWidgetProvider {

AppWidgetManager appWidgetManager;
ComponentName componentName;
RemoteViews remoteViews;
LocationManager locationManager;

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    // Update the current date
    this.appWidgetManager = appWidgetManager;
    componentName = new ComponentName(context, Henk.class);
    remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);

    SimpleDateFormat dayofweekformat = new SimpleDateFormat("EEEE");
    Date dayofweekdate = new Date(System.currentTimeMillis());
    String dayofweeklowercase = dayofweekformat.format(dayofweekdate);
    String dayofweek = dayofweeklowercase.toUpperCase();

    SimpleDateFormat monthformat = new SimpleDateFormat("MMMM dd, yyyy");
    Date monthdate = new Date(System.currentTimeMillis());
    String month = monthformat.format(monthdate);

    Log.d("TAG", "----> DAY OF WEEK: " + dayofweek); // Fine in LogCat
    Log.d("TAG", "----> MONTH AND DATE: " + month); // Fine in LogCat

    remoteViews.setTextViewText(R.id.widget_textview1, dayofweek);
    remoteViews.setTextViewText(R.id.widget_textview2, month);

    appWidgetManager.updateAppWidget(componentName, remoteViews);

}
}

РЕДАКТИРОВАТЬ:

Я реализовал решение, предоставленное Doomsknight, так что теперь я думаю, что мой метод onUpdate() должен быть в порядке. Это все еще не показывает мне день и дату все же. Однако, когда я тестировал его, я заметил, что onUpdate() фактически выполняется до того, как мое действие по настройке будет закрыто. В моей работе по настройке у меня есть следующий код для инициализации моего виджета (по крайней мере, это то, что он должен делать), и я думаю, что здесь есть ошибка:

public void onClick(View view) {
    // Launch the Widget and close the configuration Activity
    Intent intent2 = new Intent(context, Henk.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent2, 0);
    remoteViews.setOnClickPendingIntent(R.id.configuration_button, pendingIntent);
    appWidgetManager.updateAppWidget(appWidgetID, remoteViews);

    Log.d("TAG", "----> APP WIDGET ID: " + appWidgetID);
    Log.d("TAG", "----> REMOTEVIEWS: " + remoteViews);

    Intent result = new Intent();
    result.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetID);
    setResult(RESULT_OK, result);
    finish();
}

1 ответ

Решение

Вы должны иметь в виду, что в одном приложении может быть много виджетов. Пользователь может разместить два или более на вашем экране.

То, что вы пропустили, это циклическое прохождение идентификаторов. Вы передали некоторый идентификатор компонента, который вы генерируете, а не идентификатор виджета, и поэтому он не обновляет правильный виджет.

Виджеты могут обновляться не менее 30 минут. Каждая 1 секунда не будет работать, если вы не используете AlarmManager, Вам не нужно это в вашем случае.

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

    for (int appWidgetId : appWidgetIds) {

            remoteViews = new RemoteViews(context.getPackageName(), R.layout.main);
            SimpleDateFormat dayofweekformat = new SimpleDateFormat("EEEE");
            Date dayofweekdate = new Date(System.currentTimeMillis());
            String dayofweeklowercase = dayofweekformat.format(dayofweekdate);
            String dayofweek = dayofweeklowercase.toUpperCase();

            SimpleDateFormat monthformat = new SimpleDateFormat("MMMM dd, yyyy");
            Date monthdate = new Date(System.currentTimeMillis());
            String month = monthformat.format(monthdate);

            Log.d("TAG", "----> DAY OF WEEK: " + dayofweek); // Fine in LogCat
            Log.d("TAG", "----> MONTH AND DATE: " + month); // Fine in LogCat

            remoteViews.setTextViewText(R.id.widget_textview1, dayofweek);
            remoteViews.setTextViewText(R.id.widget_textview2, month);

        appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
    }
}
Другие вопросы по тегам