2012-04-20 184 views
4

好吧,这让我疯狂。我开发了一个App-widget。一切工作正常。如何从其他活动启动Android AppWidget的配置活动?

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

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

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

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

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

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

任何有关这方面的帮助都会让我花费数小时来找到解决方案,值得一提。先谢谢你。

p.s.请原谅我的英语,因为他们不是我的母语......

+0

那么我应该得到一些徽章。似乎我问了最困难的android appwidgets问题... – Christos 2012-04-25 13:11:30

+0

为什么不把widget ID插入开始你的活动的意图?所以关于知道id并且可以使用它来开始配置 – zapl 2012-05-01 02:13:20

+0

这正是我想要实现的,但是我找不到widget ID。它只在一个地方,在widget提供者的onUpdate方法中。所以基于这个事实和Cory Chaltron的回答,我终于成功地完成了这项工作。请在接受的答案和我的回答中查看评论。非常感谢你。 – Christos 2012-05-01 19:19:34

回答

1

你是如何设置你的小部件视图?我有一个应用程序,用于遍历活动窗口小部件,并在那里配置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); 
} 
+0

我接受你的答案,因为它打开了我的眼睛,并指出我正确的方向。但是,如果用户有多个小部件实例在运行,则必须使“Intent”唯一,才能使其工作。这就是为什么我张贴我的答案,以防万一有人想要完整的解决方案。谢谢。 – Christos 2012-05-01 19:22:14

+0

RemoteViews没有findViewById方法,并且点击通过setOnClickPendingIntent – 2013-10-01 12:09:17

1

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

在窗口小部件提供程序onUpdate方法中,我应该创建一个“唯一”意图传递给待处理意图,以处理关于该活动的启动。由于Android比较Intents的方式,将WidgetID传递给extras的功能不够,您还应该将其作为数据传递给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) 

虽然我回答我自己的问题,我不接受它,因为它是基于科里的答案。谢谢大家的帮助...

+2

或者''aboutIntent.setData(aboutIntent.toUri(Intent.URI_INTENT_SCHEME));'也可以工作(它编码额外元素)来管理。 – Karakuri 2013-04-28 22:51:19

+0

你需要将它解析成像这样的''aboutIntent.setData(Uri.parse(aboutIntent.toUri(Intent.URI_INTENT_SCHEME)));' – 2014-01-26 14:55:56