3

我正在制作一个应用程序小部件,但我遇到了点击事件的问题,当系统终止小部件的进程并稍后重新启动它时,该事件会丢失。屏幕旋转后也会发生这种情况。

针对 SDK 版本 7 构建并在模拟器 (2.1) 和具有 2.3.3 的真实设备上运行。

我的 onUpdate 方法:

public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    for (int wid : appWidgetIds) {
        Log.i(TAG, "onUpdate widget #" + wid);

        Intent intent = new Intent(context, MyClass.class);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, wid);

        PendingIntent clickIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteViews widget = new RemoteViews(context.getPackageName(), R.layout.widget);
        widget.setOnClickPendingIntent(R.id.widget_layout, clickIntent);

        appWidgetManager.updateAppWidget(wid, widget);
    }

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

其中 R.id.widget_layout 是 appwidget 的线性布局的 id。我尝试将此单击事件也添加到文本视图,但结果相同。

我与这个问题斗争了好几天,我发现有些人有同样的问题,但没有解决方案对我有用:(我也尝试了不同的待处理意图标志,但没有任何成功。

第二个问题是,当我在主屏幕上添加另一个 appwidget 时,它对点击事件没有反应。在 logcat 中,我看到来自 onUpdate 方法“onUpdate widget #xy”的消息,但 appwidget 对点击没有反应。只有放置在主屏幕上的第一个 appwidget 会对点击做出反应,但只会持续一段时间。有任何想法吗?

4

1 回答 1

2

当您说第一个小部件停止响应点击时,您的意思onUpdate是没有调用该方法吗?也许放一些代码onEnabled(Context context)来查看是否被调用,如果是,则在该函数中放入任何必要的逻辑。onReceive此外,您可以通过该方法(在同一链接中找到)捕获意图,以查看您的小部件实际接收的意图。

此外,请确保Context您运行的接收器(传递给此函数的接收器)是应用程序或服务,而不是活动,否则对它的引用可能不会持续存在。

您还必须确保每次使用RemoteViews对象更新小部件时,都发送完全重建小部件所需的所有数据。RemoteViews这是因为,例如,在屏幕旋转时,除了您传递的最新版本之外,系统没有任何东西可以重建小部件。

于 2011-04-13T20:24:30.927 回答