【问题标题】:How to Launch an Android AppWidget's configuration Activity from another activity?如何从另一个活动启动 Android AppWidget 的配置活动?
【发布时间】:2012-05-01 15:43:41
【问题描述】:

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

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

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

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

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

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

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

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

附言请原谅我的英语不是我的母语...

【问题讨论】:

  • 我应该得到某种徽章。看来我问了最难的 android appwidgets 问题……
  • 为什么不将小部件 id 放入启动您的 about 活动的意图中?所以大概知道id,可以用它来开始配置
  • 这正是我想要实现的,但我找不到小部件 ID。它只在一个地方,在小部件提供程序的 onUpdate 方法中。因此,基于这一事实和 Cory Chaltron 的回答,我终于设法完成了这项工作。请参阅已接受答案和我的答案中的 cmets。非常感谢。

标签: android configuration android-appwidget


【解决方案1】:

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

【讨论】:

  • 或者,aboutIntent.setData(aboutIntent.toUri(Intent.URI_INTENT_SCHEME)); 也可以工作(它也会对附加内容进行编码)。
  • 您需要将其解析为像这样的 Uri aboutIntent.setData(Uri.parse(aboutIntent.toUri(Intent.URI_INTENT_SCHEME)));
【解决方案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 唯一才能使其工作。这就是为什么我也发布我的答案,以防万一有人想要完整的解决方案。谢谢。
  • RemoteViews 没有 findViewById 方法,通过 setOnClickPendingIntent 管理点击
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
相关资源
最近更新 更多