Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Xamarin Android中区分点击事件中的应用程序小部件实例_Android_Xamarin_Android Pendingintent_Android Appwidget - Fatal编程技术网

在Xamarin Android中区分点击事件中的应用程序小部件实例

在Xamarin Android中区分点击事件中的应用程序小部件实例,android,xamarin,android-pendingintent,android-appwidget,Android,Xamarin,Android Pendingintent,Android Appwidget,我在使用Xamarin Android将点击事件绑定到应用程序小部件时遇到问题。点击是有效的,并且正在启动活动,但是传递来区分小部件的信息是无效的。似乎正在为小部件的所有实例注册相同的意图 下面是从服务执行单击绑定的代码的简化示例。完整的代码还更新小部件上的文本。这部分工作正常,并且在小部件的每个实例上都不同,所以我相信整体更新模式是正确的。这就给我留下了intent/pending intent绑定的问题。我下面使用的模式有什么问题吗 public override StartCommandR

我在使用Xamarin Android将点击事件绑定到应用程序小部件时遇到问题。点击是有效的,并且正在启动活动,但是传递来区分小部件的信息是无效的。似乎正在为小部件的所有实例注册相同的意图

下面是从服务执行单击绑定的代码的简化示例。完整的代码还更新小部件上的文本。这部分工作正常,并且在小部件的每个实例上都不同,所以我相信整体更新模式是正确的。这就给我留下了intent/pending intent绑定的问题。我下面使用的模式有什么问题吗

public override StartCommandResult OnStartCommand(Intent intent, StartCommandFlags flags, int startId)
{
    var manager = AppWidgetManager.GetInstance(this);
    var ids = intent.GetIntArrayExtra(AppWidgetManager.ExtraAppwidgetIds);

    foreach (var id in ids)
    {
        var widgetView = new RemoteViews(PackageName, Resource.Layout.SingleRateWidget);
        var activityIntent = new Intent(this, typeof(ExchangesActivity));
        activityIntent.SetFlags(ActivityFlags.ClearTop | ActivityFlags.NewTask);
        activityIntent.PutExtra("WidgetId", id);
        var pendingIntent = PendingIntent.GetActivity(this, 0, activityIntent, PendingIntentFlags.UpdateCurrent);
        widgetView.SetOnClickPendingIntent(Resource.Id.widgetBackground, pendingIntent);
        manager.UpdateAppWidget(id, widgetView);
    }

    return StartCommandResult.Sticky;
}

谢谢。

经过更多搜索,我在Java Android开发的一个问题中找到了修复方法:

简短回答,将挂起意图的创建更改为:

var pendingIntent = PendingIntent.GetActivity(this, id, activityIntent, PendingIntentFlags.UpdateCurrent);
长话短说,Android没有看到挂起的意图有什么不同,所以每次都重复使用相同的挂起的意图。对PutExtra有一个意图并不足以区分动作。通过将requestCode设置为widget ID,可以使挂起的意图变得唯一。另一个选项是使用唯一的URI(使用应用程序小部件id)在操作意图上执行SetData,但只在挂起的意图上使用requestCode更容易