2017-07-24 91 views
0

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

我已经实施了一个小部件,从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

回答

2

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

的原因是,当你点击你的widget,你widget类不能接收click事件,它不知道什么时候能更新时间。

当你点击你的Widget,它将发送一个broadcast,您可以覆盖OnReceiveWidget得到这个消息,在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效果。

+0

谢谢,那完美的作品 – Eve