xamarin表单 - android小部件更新

时间:2017-07-24 11:52:52

标签: android xamarin widget

美好的一天,我有一个xamarin表单应用程序,我需要在Android平台上构建一个小部件。

我已经实施了SimpleWidgetHelloAppWidget的小部件。

问题是:

每次用户点击窗口小部件时都应该更新,显示当前时间。它在xamarin Android中更新,但不在Forms中。在xamarin表单中,onUpdate方法仅在创建窗口小部件后立即使用一次,而在用户单击它时不会调用。

 [BroadcastReceiver(Label = "WIIDget")]
    [IntentFilter(new string[] {"android.appwidget.action.APPWIDGET_UPDATE"})]
    [MetaData("android.appwidget.provider", Resource = "@xml/appwidgetprovider")]
    public class Widget : AppWidgetProvider
    {
        public static string AnnouncmentClick = "AnnouncementClickTag";

        public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
        {
            var me = new ComponentName(context, Java.Lang.Class.FromType(typeof(Widget)).Name);
            appWidgetManager.UpdateAppWidget(me, BuildRemoteViews(context, appWidgetIds));
        }

        private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
        {
            var widgetView = new RemoteViews(context.PackageName, Resource.Layout.Widget);
            widgetView.SetTextViewText(Resource.Id.widgetMedium, "I am a title");
            widgetView.SetTextViewText(Resource.Id.widgetSmall, $"Last click in {DateTime.Now}");

            var intent = new Intent(context, typeof(Widget));
            intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
            intent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetIds);

            var piBackground = PendingIntent.GetBroadcast(context, 0, intent, PendingIntentFlags.UpdateCurrent);
            widgetView.SetOnClickPendingIntent(Resource.Id.widgetBackground, piBackground);

            return widgetView;
        }
    }

P.S这个实现以xamarin形式工作,我可以看到打开小部件的时间。但是当我点击它时,时间不会更新,就像在xamarin android中一样。

1 个答案:

答案 0 :(得分:2)

  

每次用户点击窗口小部件时都应更新窗口小部件,显示当前时间。

原因是当您点击widget时,您的widget班级无法收到点击事件,但它不知道何时更新时间。

当您点击Widget时,它会发送broadcast,您可以覆盖OnReceive中的Widget以获取此消息,在OnReceive }方法,您可以更新Widget,显示当前时间。像这样的代码:

public override void OnReceive(Context context, Intent intent)
{
    if (intent.Action.Equals("android.appwidget.action.APPWIDGET_UPDATE"))
    {
        var widgetView = new RemoteViews(context.PackageName, Resource.Layout.Widget);
        widgetView.SetTextViewText(Resource.Id.widgetMedium, "I am a title");
        widgetView.SetTextViewText(Resource.Id.widgetSmall, $"Last click in {DateTime.Now}");

        var piBackground = PendingIntent.GetBroadcast(context, 0, intent, PendingIntentFlags.UpdateCurrent);
        widgetView.SetOnClickPendingIntent(Resource.Id.widgetBackground, piBackground);

        AppWidgetManager manger = AppWidgetManager.GetInstance(context);
        ComponentName thisName = new ComponentName(context, Java.Lang.Class.FromType(typeof(Widget)).Name);
        manger.UpdateAppWidget(thisName, widgetView);
    }
}

我在Xamarin.Forms项目中写作,效果类似于this