我有一个小部件,它的设置,以便当我点击它时,它会在活动中打开一些设置。
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
这会为应用程序配置一些设置。我想要实现的是让窗口小部件更新其视图以反映活动I启动关闭时更改的设置。使用更新间隔或任何其他类型的轮询不适合此。
我在这里看到了几个地方,在Android文档中使用了这段代码:
appWidgetManager.updateAppWidget(mAppWidgetId, views);
但我不知道如何获得mAppWidgetId值。我尝试按照http://developer.android.com/guide/topics/appwidgets/index.html中的窗口小部件配置活动的示例,但在以下代码中,
Intent intent = getIntent();
Bundle extras = intent.getExtras();
if (extras != null) {
mAppWidgetId = extras.getInt(
AppWidgetManager.EXTRA_APPWIDGET_ID,
AppWidgetManager.INVALID_APPWIDGET_ID);
}
extras总是为null,所以我永远不会得到AppWidgetID。
好的,现在我只是在闲聊。你觉得我能做什么?
答案 0 :(得分:17)
我终于找到了我正在寻找的答案,它是在updateAppWidget函数的重载中。
appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
这让我可以访问小部件而无需知道appWidgetID。我的活动中的最终代码是:
// Create an Intent to launch ExampleActivity
Intent intent = new Intent(this, Settings.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
finish();
我必须在Widget的onUpdate方法中执行所有相同的设置操作,但现在每次退出活动时,Widget都会显示正确的状态。
答案 1 :(得分:13)
还有另一种方法 - 在用于启动活动的待定意图中传递窗口小部件ID:
Intent clickIntent=new Intent(context, MyConfigActivity.class);
clickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
// you have the widgetId here, since it's your onUpdate
PendingIntent pendingIntent=PendingIntent
.getActivity(context, 0,
clickIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
此外,为避免重复来自 onUpdate()的代码,您可以将意图广播回AppWidgetProvider:
Intent intent = new Intent(this,MyAppWidgetProvider.class);
intent.setAction("android.appwidget.action.APPWIDGET_UPDATE");
// Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,
// since it seems the onUpdate() is only fired on that:
int[] ids = {widgetId};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
sendBroadcast(intent);
答案 2 :(得分:8)
我知道这已经得到了回答和接受。然而,当我搜索同样的东西时,我遇到了一种非常简单的方法来更新小部件。
对于未来的读者:
最好的部分,这适用于窗口小部件的所有实例以及任何上下文(活动,服务等)
继承代码,
Context context = this;
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_2x1);
ComponentName thisWidget = new ComponentName(context, MyWidget.class);
remoteViews.setTextViewText(R.id.my_text_view, "myText" + System.currentTimeMillis());
appWidgetManager.updateAppWidget(thisWidget, remoteViews);
答案 3 :(得分:1)
我不想从您的活动中进行调用,而是优先向窗口小部件发送广泛的转换请求以进行更新。将触发onUpdate方法并传递所有窗口小部件布局。
以下是我的代码:
1-从活动中发送广播:
Intent intent = new Intent(ctxt, MyAppWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int[] ids = {R.layout.appwidget};
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS,ids);
ctxt.sendBroadcast(intent);
现在,2-实现onUpdate方法:
Intent i = new Intent(ctxt, Settings.class);
PendingIntent pi = PendingIntent.getActivity(ctxt, 0, i, 0);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(ctxt.getPackageName(), widgetId);
remoteViews.setTextViewText(R.id.statusMsg, msg);
remoteViews.setOnClickPendingIntent(R.id.rootView, pi);
AppWidgetManager mngr = AppWidgetManager.getInstance(ctxt);
ComponentName wdgt = new ComponentName(ctxt, MyAppWidgetProvider.class);
mngr.updateAppWidget(wdgt, remoteViews);
}
就是这样!我希望它可以帮助你:)
答案 4 :(得分:0)
RemoteViews view = new RemoteViews("pakagename", R.layout.widget_layout_name);
view.setTextViewText(R.id.textView_id, String.valueOf(hr + ":" + mi)); // for setting a textview
view.setCharSequence(R.id.PunchIn, "setText", "Punch In"); //for setting a button name
view.setInt(R.id.PunchIn, "setBackgroundResource", R.color.black); //for setting button color
ComponentName theWidget = new ComponentName(getActivity(), AppWidget_name.class);
AppWidgetManager manager = AppWidgetManager.getInstance(getActivity());
manager.updateAppWidget(theWidget, view);