4

好吧,这让我发疯了。我开发了一个应用程序小部件。一切正常。

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

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

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

配置活动需要 AppWidgetManager.EXTRA_APPWIDGET_ID 才能完成工作(保存此特定 widgetid 的用户设置),因此当我从另一个活动调用它时,我必须以某种方式传递这个额外内容。显而易见的想法是:

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

现在我的问题是widgetid在哪里?我找到了一百万种获取widgetids(数组)的方法,但没有一条关于如何获取启动“关于活动”的特定widgetid的线索

任何有关这方面的帮助都会使我花在寻找解决方案上的时间变得有价值。先感谢您。

ps 请原谅我的英语,因为它们不是我的母语...

4

2 回答 2

3

感谢 Cory Chaltron,这是我的问题的解决方案。

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

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 的回答。谢谢大家的帮助...

于 2012-05-01T19:32:18.767 回答
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);
}
于 2012-05-01T02:26:53.603 回答