美好的一天,我有一个xamarin表单应用程序,我需要在Android平台上构建一个小部件。
我已经实施了SimpleWidget
和HelloAppWidget
的小部件。
问题是:
每次用户点击窗口小部件时都应该更新,显示当前时间。它在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中一样。
答案 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。