【发布时间】:2021-02-28 15:13:52
【问题描述】:
我制作了一个带有 Button 和 TextView 的 Xamarin.Android Widget。我在 App.cs 中声明了一个产品实例 (latestProduct)。添加新产品时,会将新产品分配给 latestProduct。
用户可以通过单击 Xamarin.Forms 页面上的按钮 (BtnAdd) 来保存新记录。当用户单击此按钮时,我正在尝试更新小部件 TextView。
我的页面:
void BtnAdd_Clicked(object sender, EventArgs e) {
Product product = new Product
{
ProductSaveTime = DateTime.Now
};
App.Database.SaveProduct(product);
App.latestProduct = product;
DependencyService.Get<IUpdateDataService>().UpdateWidgetUI();
}
App.cs:
public static Product latestProduct;
IUpdateDataService.cs:
public interface IUpdateDataService
{
void UpdateWidgetUI();
}
WidgetClass.cs:
public class WidgetClass : AppWidgetProvider, IUpdateDataService
{
public static String SaveClick = "Save Product";
public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
var me = new ComponentName(context, Java.Lang.Class.FromType(typeof(WidgetClass)).Name);
appWidgetManager.UpdateAppWidget(me, BuildRemoteViews(context, appWidgetIds));
}
private RemoteViews BuildRemoteViews(Context context, int[] appWidgetIds)
{
var widgetView = new RemoteViews(context.PackageName, Resource.Layout.widget);
UpdateData(widgetView);
RegisterClicks(context, appWidgetIds, widgetView);
return widgetView;
}
private void UpdateData(RemoteViews widgetView)
{
CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
widgetView.SetTextViewText(Resource.Id.textView1, "Last Product: " + App.latestProduct.ProductSaveTime.ToString("g", currentCulture));
}
private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
{
var intent = new Intent(context, typeof(WidgetClass));
intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);
widgetView.SetOnClickPendingIntent(Resource.Id.buttonSave, GetPendingSelfIntent(context, SaveClick));
}
private PendingIntent GetPendingSelfIntent(Context context, string action)
{
var intent = new Intent(context, typeof(WidgetClass));
intent.SetAction(action);
return PendingIntent.GetBroadcast(context, 0, intent, 0);
}
public override void OnReceive(Context context, Intent intent)
{
base.OnReceive(context, intent);
if (SaveClick.Equals(intent.Action))
{
Product product = new Product
{
ProductSaveTime = DateTime.Now
};
App.latestProduct = product;
RemoteViews remoteViews = new RemoteViews(context.PackageName, Resource.Layout.widget);
UpdateData(remoteViews);
AppWidgetManager appWidgetManager = AppWidgetManager.GetInstance(context);
ComponentName componentName = new ComponentName(context, Java.Lang.Class.FromType(typeof(WidgetClass)).Name);
appWidgetManager.UpdateAppWidget(componentName, remoteViews);
}
}
public void UpdateWidgetUI()
{
var widgetView = new RemoteViews(context.PackageName, Resource.Layout.widget);
UpdateData(widgetView);
AppWidgetManager appWidgetManager = AppWidgetManager.GetInstance(context);
ComponentName componentName = new ComponentName(context, Java.Lang.Class.FromType(typeof(WidgetClass)).Name);
appWidgetManager.UpdateAppWidget(componentName, remoteViews);
}
}
当点击 BtnAdd 时,如何使用 DependecyService 调用 UpdateData()?我遇到的问题是 UpdateWidgetUI() 中的当前上下文中不存在“上下文”;
【问题讨论】:
-
从表单访问平台特定行为,使用 DependencyService 或自定义渲染器
-
只需将“UpdateData”添加到 IUpdateDataService 接口...然后调用它 DependencyService.Get
().UpdateData();
标签: c# android xamarin xamarin.forms xamarin.android