如何从另一个活动中启动Android AppWidget的配置活动?

4

这真的让我疯了。我开发了一个应用小部件,一切都运行良好。

我有一个配置活动,在主屏幕上添加小部件时启动,并且工作得很好。我按小部件ID保存用户设置等。

该小部件有一些按钮,其中一个按钮启动一个带有关于信息的活动,“关于活动”。

“关于活动”有一个按钮,我想使用它来启动配置活动,以启动“关于活动”的小部件ID进行配置活动。我之所以要这样做,是因为我希望用户能够配置任何实例的小部件内容,而无需将其删除并重新添加(以启动配置活动)。

配置活动需要AppWidgetManager.EXTRA_APPWIDGET_ID才能完成工作(保存此特定widgetid的用户设置),因此我必须在从另一个活动调用它时传递此额外内容。显然要做的事情是:

startActivity(new Intent(context,act_configure.class).putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, ??? ));

现在我的问题是,widgetid在哪里?我找到了许多获取widgetids(数组)的方法,但没有任何线索可以获取启动“关于活动”的特定widgetid。
如果能得到帮助,这将使我花费的时间更加有价值。提前感谢您的帮助。
附注:请原谅我的英语不是我的母语...

嗯,我应该得到某种徽章。看来我问了最困难的Android AppWidgets问题... - ChD Computers
为什么不将小部件ID放入意图以启动关于活动?因此,关于了解该ID并可以使用它来开始配置。 - zapl
这正是我想要实现的,但我找不到小部件ID。它只在小部件提供程序的 onUpdate 方法中出现一次。因此,基于这个事实和Cory Chaltron的答案,我终于成功完成了工作。请参见已接受答案和我的答案中的评论。非常感谢。 - ChD Computers
2个回答

3

感谢Cory Chaltron,他为我的问题提供了解决方案。

在小部件提供程序的onUpdate方法中,我应该创建一个“唯一”的意图,传递给处理关于活动启动的待处理意图。由于Android比较意图的方式,仅在extras中传递WidgetID是不够的,您还应将其作为数据传递给意图以使其唯一。因此,这是代码:

Intent aboutIntent = new Intent(cx, act_about.class);
aboutIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetIds[i]);
// Make this unique for this appWidgetId
aboutIntent.setData(Uri.withAppendedPath(Uri.parse("customuri://widget/id/"), String.valueOf(widgetID)));
PendingIntent aboutPendingIntent = PendingIntent.getActivity(cx, 0, aboutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.cmdabout, aboutPendingIntent)

虽然我回答了自己的问题,但我没有接受它,因为它是基于Cory的答案。感谢大家的帮助...


3
另外,aboutIntent.setData(aboutIntent.toUri(Intent.URI_INTENT_SCHEME)); 也可以使用(它也对附加信息进行编码)。 - Karakuri
1
你需要将它解析成一个 Uri,像这样 aboutIntent.setData(Uri.parse(aboutIntent.toUri(Intent.URI_INTENT_SCHEME))); - Mridang Agarwalla

2

您是如何设置小部件视图的?我有一个应用程序,在其中迭代活动小部件并配置设置RemoteView。您可以在附加到“关于”按钮的onClick中设置小部件ID。

final AppWidgetManager widgetManager = AppWidgetManager.getInstance(this);
final ComponentName widgetName = new ComponentName(this, WidgetProvider.class);

final int[] widgetIds = widgetManager.getAppWidgetIds(widgetName);

for (int widgetId : widgetIds) {
    final RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.widget);

    // This is the important part :-D
    remoteViews.findViewById(R.id.your_about_button).setOnClickListener(... a listener to start your about activity that puts the widget id in the extra like you suggest in your question ...);

    widgetManager.updateAppWidget(widgetId, remoteViews);
}

我接受你的答案,因为它让我眼前一亮,并指引我朝正确的方向前进。然而,有一个“陷阱”,你必须使Intent变得唯一,以便在用户运行多个小部件实例时才能正常工作。这就是为什么我也发布了我的答案,以防有人想要完整的解决方案。谢谢。 - ChD Computers
RemoteViews没有findViewById方法,而点击事件是通过setOnClickPendingIntent来管理的。 - Jose_GD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接