10

我有一个简单的 appwidget,我想在活动(在同一个应用程序中)发生动作时更新它。在 onUpdate() 中,我立即更新了小部件,效果很好。在我的活动中,我在我的 appwidget 中调用了在 onUpdate() 中调用的相同静态更新方法来更新视图。小部件未更新。

我可以将代码直接跟踪到 AppWidgetManager.updateAppWidget() 方法中,这一切都很好,但是小部件没有更新。

我可以看到的唯一可能的区别是传递给我的静态更新方法的上下文对象是不同的,当它是从活动的上下文调用时,与 appwidget 的 onUpdate() 方法的上下文不同。但是,网上有很多这样的例子,所以我希望它应该可以工作。

4

2 回答 2

23

在没有看到您的代码的情况下,我不能 100% 确定您是如何尝试这样做的,但是这是我使用的方法。在我的Activity我有以下方法:

private void updateAllWidgets(){
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getApplicationContext());
    int[] appWidgetIds = appWidgetManager.getAppWidgetIds(new ComponentName(this, MyWidget.class));
    if (appWidgetIds.length > 0) {
        new MyWidget().onUpdate(this, appWidgetManager, appWidgetIds);
    }
}

MyWidgetappwidget 的类在哪里。我可以从我的任何地方调用这个方法Activity来更新我所有的 appwidgets。

于 2010-12-12T23:47:11.337 回答
10

与其使用静态方法,不如利用小部件已经是广播接收器这一事实,并在清单中为其注册更新意图。然后,每当您需要从活动中更新它时,只需调用

//in your activity
sendBroadcast(new Intent(MyWidget.ACTION_UPDATE).putExtra(whatever));  



//In widget class
public static final String ACTION_UPDATE = "com.example.UPDATE_MY_WIDGET";

在清单文件的接收者标签内

<intent-filter>
  <action android:name="com.example.UPDATE_MY_WIDGET"/>
</intent-filter>
于 2010-12-12T23:57:55.603 回答