2010-11-01 65 views
12

我有一个Widget,它的设置让我点击它时会在活动中打开一些设置。更新Android Widget来自活动

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); 
} 

演员总是空的,所以我从来没有得到过AppWidgetID。

好吧,现在我只是散漫。你认为我能做什么?

回答

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(); 

我必须做的所有相同的设置的东西,我曾在小部件的的onUpdate方法去做,但现在每次我离开我的活动控件已显示正确的状态。

+0

感谢分享答案!我们在哪里必须放置这些代码,在小部件设置活动或小部件类内? – BamsBamx 2012-10-10 10:47:31

+0

Nevermind,我把这里面updateWidget方法,通过“上下文”改变了一些“this”,并删除了“AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this)'现在它正在工作......谢谢! – BamsBamx 2012-10-10 11:09:49

+1

如果您有多个小部件配置,您可能需要尝试appWidgetManager.getAppWidgetIds(component),然后遍历它们。 – rwilson04 2013-03-15 04:22:27

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); 
+0

感谢分享代码。现在我可以从活动中更新小部件 – 2013-02-18 10:40:28

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); 

Courtesy - Stuck :)

+1

This !!我一直在努力争取更新一个小部件上的TextView,并解决了这个问题。谢谢!! :) – wislon 2014-07-22 05:40:42

+0

非常欢迎。快乐是我的。快乐编码。 :) – 2014-07-28 17:37:52

+0

这对我工作...感谢哥们:) – user1090751 2017-07-07 09:47:04

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); 
} 

这就是它!我希望它可以帮助你:)