android小部件没有响应

时间:2010-06-14 00:45:24

标签: android widget

我有一个你按下的小部件然后它会更新小部件上的文本。我已经设置了一个on click监听器来启动另一个活动来执行文本更新,但由于某种原因它只能暂时工作,然后它会变得没有响应,并且在按下时不会执行任何操作。有谁知道它为什么这样做?我在下面发布了我的小部件代码以防它有用。

@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 个答案:

答案 0 :(得分:1)

onUpdate方法不会更新除PendingIntent之外的RemoteViews中的任何数据,因此如果调用了该数据,则窗口小部件将恢复为R.layout.widget中定义的状态。

您是否拥有在用户交互后调用updateAppWidget的代码?这也许有帮助。

此外,如果更新是内联的并且不需要任何UI,则无需启动活动即可执行该更新。如果您的PendingIntent用于广播接收器,使用PendingIntent.getBroadcast,它会更高效并且不会破坏后台堆栈。您可以使用与您的应用小部件提供商相同的BroadcastReceiver。你不需要另一个。


更新:(由于文字太长,我无法在下面回复)

我会创建一个这样的函数,并从onUpdate()的活动中调用它。您需要在某处保存 text ,这样您也可以从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);
}