我有一个简单的appwidget,我想在活动中发生动作时(在同一个应用程序中)更新它。在onUpdate()中,我立即更新小部件,工作正常。在我的活动中,我在appUidget中调用了相同的静态更新方法,该方法在onUpdate()中调用以更新视图。小部件未更新。
我可以将代码直接跟踪到AppWidgetManager.updateAppWidget()方法中,这一切都很好,但是小部件不会更新。
我能看到的唯一可能的区别是,当从活动的上下文调用appwidget的onUpdate()方法的上下文时,传递给我的静态更新方法的上下文对象是不同的。但是,网上有很多例子,所以我希望它能够奏效。
答案 0 :(得分:20)
如果没有看到您的代码,我不能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);
}
}
其中MyWidget
是appwidget的类。我可以在Activity
内的任何位置调用此方法来更新我的所有appwidgets。
答案 1 :(得分:9)
不是使用静态方法,而是利用窗口小部件已经是广播接收器并在清单中为其注册更新意图这一事实。然后,只要您需要从活动中更新它,只需调用
//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>