Моя основная цель - получение данных с веб-сервиса и отображение на виджете. Согласно моим исследованиям, я нашел пример виджета на Inte rnet и изменил его для своего проекта. Проблема заключается в том, что при первом нажатии кнопки виджета он получает данные из веб-службы и хорошо их отображает. Но когда я нажал на секунду на кнопке, он не использует класс обслуживания виджетов, о котором я упоминал выше. Это мой WidgetService.class.
[Service(Permission = "android.permission.BIND_REMOTEVIEWS", Exported = false)]
public class WidgetService : RemoteViewsService
{
public override IRemoteViewsFactory OnGetViewFactory(Intent intent)
{
int appWidgetId = intent.GetIntExtra(AppWidgetManager.ExtraAppwidgetId, AppWidgetManager.InvalidAppwidgetId);
int mode = intent.GetIntExtra("Mode",0);
int level = intent.GetIntExtra("Level",0);
ListProvider lp = new ListProvider(this.ApplicationContext , mode , level);
return lp;
}
}
У меня есть класс widgetProvider для управления всеми действиями с виджетом.
[BroadcastReceiver(Label = "LifeApp")]
[IntentFilter(new string[] { "android.appwidget.action.APPWIDGET_UPDATE" })]
[MetaData("android.appwidget.provider", Resource = "@xml/widgetinfo")]
public class WidgetProvider : AppWidgetProvider
{
private static string Button1Click = "Button1Click";
private static string Button2Click = "Button2Click";
private static int WidgetID;
private static int[] WidgetID2;
public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
WidgetID = appWidgetIds[0];
WidgetID2 = appWidgetIds;
RemoteViews remoteViews = updateWidgetListView(context, appWidgetIds[0], 0);
//Button click events setting this method.
RegisterClicks(context, appWidgetIds, remoteViews);
appWidgetManager.UpdateAppWidget(appWidgetIds[0], remoteViews);
base.OnUpdate(context, appWidgetManager, appWidgetIds);
}
public override void OnReceive(Context context, Intent intent)
{
base.OnReceive(context, intent);
AppWidgetManager appWidgetManager = AppWidgetManager.GetInstance(context);
RemoteViews remoteViews = new RemoteViews(context.PackageName, Resource.Layout.Main);
if (Button1Click.Equals(intent.Action))
{
CustomWidgetButtonClickEvent(appWidgetManager, context, 0);
remoteViews.SetOnClickPendingIntent(Resource.Id.Satis, GetPendingSelfIntent(context, SatisClick));
}
else if (Button2Click.Equals(intent.Action))
{
CustomWidgetButtonClickEvent(appWidgetManager, context, 1);
}
}
private PendingIntent GetPendingSelfIntent(Context context, string action)
{
var intent = new Intent(context, typeof(WidgetProvider));
intent.SetAction(action);
return PendingIntent.GetBroadcast(context, 0 , intent, PendingIntentFlags.CancelCurrent);
}
public void CustomWidgetButtonClickEvent(AppWidgetManager appWidgetManager, Context context, int mode)
{
RemoteViews remoteViews = updateWidgetListView(context, WidgetID, mode);
appWidgetManager.UpdateAppWidget(WidgetID, remoteViews);
}
private RemoteViews updateWidgetListView(Context context, int appWidgetId, int mode)
{
RemoteViews remoteViews = new RemoteViews(context.PackageName, Resource.Layout.Main);
string PACKAGE_NAME = context.PackageName;
Intent svcIntent = new Intent(context, typeof(WidgetService));
svcIntent.SetPackage(PACKAGE_NAME);
svcIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
svcIntent.PutExtra("Mode", mode);
svcIntent.PutExtra("Level", 0);
svcIntent.SetData(Android.Net.Uri.Parse(svcIntent.ToUri(Android.Content.IntentUriType.AndroidAppScheme)));
remoteViews.SetEmptyView(Resource.Id.listViewBaslik, Resource.Id.empty_view);
remoteViews.SetRemoteAdapter(appWidgetId, Resource.Id.listViewBaslik, svcIntent);
Intent testIntent = new Intent(context, typeof(WidgetService));
testIntent.SetPackage(PACKAGE_NAME);
testIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetId);
testIntent.PutExtra("Mode", mode);
testIntent.PutExtra("Level", 1);
testIntent.SetData(Android.Net.Uri.Parse(testIntent.ToUri(Android.Content.IntentUriType.AndroidAppScheme)));
remoteViews.SetEmptyView(Resource.Id.listViewIcerik, Resource.Id.empty_view2);
remoteViews.SetRemoteAdapter(appWidgetId, Resource.Id.listViewIcerik, testIntent);
return remoteViews;
}
private void RegisterClicks(Context context, int[] appWidgetIds, RemoteViews widgetView)
{
var intent = new Intent(context, typeof(WidgetProvider));
intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, appWidgetIds);
widgetView.SetOnClickPendingIntent(Resource.Id.Button1, GetPendingSelfIntent(context, Button1Click));
widgetView.SetOnClickPendingIntent(Resource.Id.Button2, GetPendingSelfIntent(context, Button2Click));
}
}
Мой Класс ListProvider как это
public class ListProvider : Java.Lang.Object, RemoteViewsService.IRemoteViewsFactory
{
private List<Item> listItemList = new List<Item>();
private Context context;
private readonly int _mode;
private readonly int _level;
public ListProvider(Context contextNew , int mode , int level)
{
_mode = mode;
_level = level;
context = contextNew;
DataLoad();
}
private void DataLoad()
{
var DataList = GlobalVar.LifeService.Life_getAnlikSatisAuth("XXX", "XXX");
foreach (Item item in DataList)
{
if (item.Mode == _mode && item.Level == _level)
{
listItemList.Add(new MudoAnlık
{
Mode = item.Mode,
Level = item.Level,
LevelKey = item.LevelKey,
LevelText = item.LevelText,
RowNumber = item.RowNumber,
Image = item.Image,
Column1 = item.Column1,
Column2 = item.Column2,
Column3 = item.Column3
});
}
}
}
public int Count { get { return listItemList.Count; } }
public long GetItemId(int position)
{
return position;
}
public RemoteViews GetViewAt(int position)
{
RemoteViews remoteView = new RemoteViews(context.PackageName, Resource.Layout.listview_row);
Item listItem = listItemList[position];
remoteView.SetTextViewText(Resource.Id.txtName2, listItem.LevelText);
remoteView.SetTextViewText(Resource.Id.txtName3, listItem.Column1);
remoteView.SetTextViewText(Resource.Id.txtName4, listItem.Column2);
if (listItem.Image.ToString().Contains("up"))
{
remoteView.SetImageViewResource(Resource.Id.imageOk,Resource.Drawable.up);
}
else
{
remoteView.SetImageViewResource(Resource.Id.imageOk, Resource.Drawable.down);
}
remoteView.SetTextViewText(Resource.Id.txtName5, listItem.Column3);
return remoteView;
}
public RemoteViews LoadingView { get { return null; } }
public int ViewTypeCount { get { return 1; } }
public bool HasStableIds { get { return true; } }
public void OnCreate()
{
// throw new NotImplementedException();
}
public void OnDataSetChanged()
{
// throw new NotImplementedException();
}
public void OnDestroy()
{
// throw new NotImplementedException();
}
}