Android-виджет не отвечает - PullRequest
2 голосов
/ 14 июня 2010

У меня есть виджет, который вы нажимаете, и он затем обновит текст на виджете.Я установил прослушиватель по щелчку, чтобы запустить другое действие для обновления текста, но по какой-то причине он работает только временно, а затем перестает отвечать на запросы и ничего не делает при нажатии.Кто-нибудь знает, почему он это делает?Я разместил код своего виджета ниже на случай, если это будет полезно.

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds) {
    thisWidget = new ComponentName(context, MemWidget.class);
    Intent intent = new Intent(context, updatewidget.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.widget);
    views.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent);

    // Tell the AppWidgetManager to perform an update on the current App Widget
    appWidgetManager.updateAppWidget(thisWidget, views);

}

@Override
public void onReceive(Context context, Intent intent) 
{
    appWidgetManager = AppWidgetManager.getInstance(context);
    remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
    thisWidget = new ComponentName(context, MemWidget.class);

    // v1.5 fix that doesn't call onDelete Action
    final String action = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(action)) {
        final int appWidgetId = intent.getExtras().getInt(
            AppWidgetManager.EXTRA_APPWIDGET_ID,
            AppWidgetManager.INVALID_APPWIDGET_ID);
            if (appWidgetId != AppWidgetManager.INVALID_APPWIDGET_ID) {
                this.onDeleted(context, new int[] { appWidgetId });
            }
        } 
    else 
    {   
        super.onReceive(context, intent);
    }
}

Вот код, который вызывается из моей деятельности

thisWidget = new ComponentName(this, MemWidget.class);
appWidgetManager = AppWidgetManager.getInstance(this);
remoteViews = new RemoteViews(this.getPackageName(), R.layout.widget);

//do work

remoteViews.setTextViewText(R.id.ImageButton01,"setting text here");
appWidgetManager.updateAppWidget(thisWidget, remoteViews);

1 Ответ

1 голос
/ 15 июня 2010

Метод onUpdate не обновляет никакие данные в RemoteViews, кроме PendingIntent, поэтому, если он когда-либо вызывается, виджет вернется в состояние, определенное в R.layout.widget.

У вас есть код, который вызывает updateAppWidget после взаимодействия с пользователем?Это также может помочь.

Кроме того, если обновление встроено и не требует какого-либо пользовательского интерфейса, вам не нужно запускать действие, чтобы выполнить это обновление.Он более эффективен и не нарушит задний стек, если вместо этого PendingIntent предназначен для широковещательного приемника, используя PendingIntent.getBroadcast.Вы можете использовать тот же BroadcastReceiver, что и поставщик виджетов вашего приложения.Вам не нужен еще один.


Обновление: (Я не могу ответить ниже, потому что текст слишком длинный)

Я бы сделалФункция, как это, и вызвать его из вашей деятельности из onUpdate ().Вам нужно где-то сохранить текст , чтобы вы также могли передать его из onUpdate ().В противном случае он вернет текст по умолчанию в R.layout.widget.

void updateWidget(Context context, CharSequence text) {
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);

    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
    remoteViews.setOnClickPendingIntent(R.id.ImageButton01, pendingIntent);

    remoteViews.setTextViewText(R.id.ImageButton01, text);

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    ComponentName thisWidget = new ComponentName(context, MemWidget.class);
    appWidgetManager.updateAppWidget(thisWidget, remoteViews);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...