2017-07-24 25 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