【问题标题】:Differentiating instances of app widgets in click events in Xamarin Android在 Xamarin Android 中的点击事件中区分应用小部件的实例
【发布时间】:2018-05-30 10:11:51
【问题描述】:

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

以下是从服务执行点击绑定的代码的精简示例。完整的代码还会更新小部件上的文本。该部分工作正常,并且在小部件的每个实例上都不同,所以我相信整体更新模式是正确的。这让我将意图/待定意图绑定作为问题。我在下面使用的模式有问题吗?

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;
}

谢谢。

【问题讨论】:

    标签: android xamarin android-pendingintent android-appwidget


    【解决方案1】:

    经过更多搜索后,我在此处的 Java Android 开发问题中找到了解决方法:

    Multiple Instances Of Widget Only Updating Last widget

    简短的回答,将未决意图的创建更改为:

    var pendingIntent = PendingIntent.GetActivity(this, id, activityIntent, PendingIntentFlags.UpdateCurrent);
    

    长答案,Android 没有看到待处理意图的差异,因此它每次都重用相同的待处理意图。使用 PutExtra 的意图不足以区分操作。通过将 requestCode 设置为小部件 ID,可以使待处理的意图独一无二。另一种选择是使用唯一的 URI(使用应用小部件 id)对操作意图执行 SetData,但在待处理的意图上使用 requestCode 会更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2013-11-09
      相关资源
      最近更新 更多