Почему мой виджет приложения не обновляется в API 3 или 4? - PullRequest
6 голосов
/ 29 ноября 2010

Я работаю над Android-виджетом, и он отлично работает в API уровня 5 или выше. Он не поддерживается вообще в API уровня 1 или 2. Он должен работать абсолютно нормально в 3 и 4, но по какой-то причине виджет не обновляется.

Метод onUpdate вызывается и выполняется без ошибок; однако в 3 и 4 это не меняет текст виджета. Я в значительной степени в замешательстве. Есть мысли?

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

    DataAccess helper = new DataAccess(context);
    String text = helper.getCurrentText();
    helper.close();

    if (text != null)
        views.setTextViewText(R.id.widget_text, text);

    Intent intent = new Intent(context, WidgetDetailsActivity.class);
    PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
    views.setOnClickPendingIntent(R.id.widget, pending);

    appWidgetManager.updateAppWidget(appWidgetIds, views);
}

Ответы [ 2 ]

0 голосов
/ 02 апреля 2012

Вам нужно запустить сервис по методу обновления и также ввести весь свой код в сервис, здесь я даю onReceive и сервис демо context.startService(new Intent(context, UpdateService.class));

public static class UpdateService extends Service {
    @Override
    public void onStart(Intent intent, int startId) {
        // Build the widget update for today
        RemoteViews updateViews = buildUpdate(this);
        // Push update for this widget to the home screen
        ComponentName thisWidget = new ComponentName(this,
                Widget.class);
        AppWidgetManager manager = AppWidgetManager.getInstance(this);
        manager.updateAppWidget(thisWidget, updateViews);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

@Override
public void onReceive(Context context, Intent intent) {
    final RemoteViews remoteViews  = buildUpdate(context);
    ComponentName cn = new ComponentName(context, Widget.class);
    AppWidgetManager.getInstance(context).updateAppWidget(cn, remoteViews);
    super.onReceive(context, intent);
}

где buildUpdate - метод для кода обновления вашего виджета

0 голосов
/ 23 августа 2011

Попробуйте это:

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

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget);

    DataAccess helper = new DataAccess(context);
    String text = helper.getCurrentText();
    helper.close();

    if (text != null)
        views.setTextViewText(R.id.widget_text, text);

    Intent intent = new Intent(context, WidgetDetailsActivity.class);
    PendingIntent pending = PendingIntent.getActivity(context, 0, intent, 0);
    views.setOnClickPendingIntent(R.id.widget, pending);

    appWidgetManager.updateAppWidget(appWidgetIds, views);

   super.onUpdate(context, appWidgetManager, appWidgetIds);
}
...