Android:配置小部件(不同小部件实例的相同 setOnClickPendingIntent 附加功能)

Posted

技术标签:

【中文标题】Android:配置小部件(不同小部件实例的相同 setOnClickPendingIntent 附加功能)【英文标题】:Android: configuring widget (same setOnClickPendingIntent extras for different widgets instance) 【发布时间】:2013-08-25 08:17:14 【问题描述】:

我正在做一些 android 练习,但小部件有问题:

目标:当用户将新的小部件添加到主页时,应用程序会运行一个配置,用户可以在其中选择一个字符串。 在配置期间,该字符串必须设置为我的小部件布局中唯一按钮的“文本”,并且在该按钮上,应用程序必须设置一个 onclick 侦听器,该侦听器将调用另一个将字符串作为参数传递的活动。因此,当用户单击按钮时,将调用提供按钮文本的活动。主要目标是,如果我有两个小部件,每个小部件都设置 onclick 侦听器发送不同的字符串作为参数。

代码:

int mAppWidgetId = 0;

if (extras != null) 
   mAppWidgetId = extras.getInt(
   AppWidgetManager.EXTRA_APPWIDGET_ID, 
   AppWidgetManager.INVALID_APPWIDGET_ID);
 

String thestring = ... //this string is set dynamically by the configuration


RemoteViews views = new RemoteViews(this.getPackageName(), R.widget_profile);


    views.setTextViewText(R.id.buttonWidget, thestring);


    Intent clickIntent = new Intent(this, afterclickactivity.class);
    clickIntent.putExtra("TheString", thestring);

    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, clickIntent, 0);
    views.setOnClickPendingIntent(R.id.buttonWidget, pendingIntent);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this);
    appWidgetManager.updateAppWidget(mAppWidgetId, views);

问题:一切似乎工作正常,小部件位于主屏幕中,按钮上的文本是用户选择的文本,如果我添加相同小部件的 2 个实例根据用户选择,它们具有不同的文本。但是当用户按下第二个小部件上的按钮时,它会启动“afterclickactivity”,其参数与 widget1 相同,忽略第二个选择的字符串。

是这样的:

小部件 1: 文本:字符串 1 onclick: callActivity(string1)

小部件 2: 文本:字符串2 onclick: callActivity(string1)

【问题讨论】:

【参考方案1】:

这是由 Intent 的比较方式引起的。 PendingIntent 已在系统中注册,当您尝试添加另一个时,将执行与已注册的相等性检查。包含的 Intent 使用 Intent.filterEquals 进行比较,它检查 Intent 的操作、数据、类型、类和类别。如果已经注册的 Intent 和新的 Intent 相同,则 PendingIntent 不会重复。它要么被替换,要么被留下(取决于参数,你的选择)。

请注意,这里没有比较附加项

因此,您需要以某种方式区分意图,例如使用数据字段或请求代码。

在此处查看有关 PendingIntent 的文档:http://developer.android.com/reference/android/app/PendingIntent.html

以及有关 Intent 本身的相关文档

帕维尔

【讨论】:

【参考方案2】:

我遇到了同样的问题,并在此链接上找到了解决方案 http://www.bogdanirimia.ro/android-widget-click-event-multiple-instances/269

解决方法如下: Android 会重用 Intent,因此当您创建 Intent 时,请确保输入唯一 ID,否则所有实例都会触发之前使用的相同 Intent!就凭这个细节我花了半天时间! ( PendingIntent pendingIntent = PendingIntent.getBroadcast(context, appWidgetId, clickIntent, 0); )

【讨论】:

以上是关于Android:配置小部件(不同小部件实例的相同 setOnClickPendingIntent 附加功能)的主要内容,如果未能解决你的问题,请参考以下文章

具有不同 ListView 数据的相同小部件

多个 Android Widget 实例仅更新最后一个小部件

android有相同的小部件吗?

Android 小部件通过意图将数据发送到 onRecive

android 小部件是不是在与其应用程序相同的进程中运行

检测所有小部件的Android实例?