从活动更新Android小部件

Kra*_*atz 12 android widget android-activity

我有一个小部件,它的设置,以便当我点击它时,它会在活动中打开一些设置.

views.setOnClickPendingIntent(R.id.btnActivate, pendingIntent);
Run Code Online (Sandbox Code Playgroud)

这会为应用程序配置一些设置.我想要实现的是让窗口小部件更新其视图以反映活动I启动关闭时更改的设置.使用更新间隔或任何其他类型的轮询不适合此.

我在这里看到了几个地方,在android文档中使用了这段代码:

appWidgetManager.updateAppWidget(mAppWidgetId, views);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何获得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);
}
Run Code Online (Sandbox Code Playgroud)

extras总是为null,所以我永远不会得到AppWidgetID.

好的,现在我只是漫无边际.你觉得我能做什么?

Kra*_*atz 17

我终于找到了我正在寻找的答案,它是在updateAppWidget函数的重载中.

   appWidgetManager.updateAppWidget(new ComponentName(this.getPackageName(), Widget.class.getName()), views);
Run Code Online (Sandbox Code Playgroud)

这让我可以访问小部件而无需知道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();
Run Code Online (Sandbox Code Playgroud)

我必须在Widget的onUpdate方法中执行所有相同的设置操作,但现在每次退出活动时,Widget都会显示正确的状态.


小智 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);
Run Code Online (Sandbox Code Playgroud)

此外,为了避免从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);
Run Code Online (Sandbox Code Playgroud)


Atu*_*lic 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);
Run Code Online (Sandbox Code Playgroud)

礼貌 - 坚持:)