如何在Xamarin Android小工具中收听项目点击



问题

我已经实现了这段代码AppWidgetListView,并尝试附加点击。

进展顺利:所以,从小部件中但在ListView之外的按钮进行点击是有效的。您可以在实现AppWidgetProvider的类(WordWidget(的OnReceive方法上看到按钮的点击结果。

不起作用的是:当您从ListView中单击一个项(或该项中的元素(时,它不会显示任何内容。

尝试次数

示例1

Intent configIntent = new Intent(context, typeof(WordWidget));
configIntent.PutExtra("appWidgetId", ids[i]);
PendingIntent configPendingIntent = PendingIntent.GetActivity(context, 0, configIntent, 0);
remoteViews.SetOnClickPendingIntent(Resource.Id.button, configPendingIntent);

示例2

Intent active = new Intent(context, typeof(WordWidget));
active.SetAction("aaa");
PendingIntent actionPendingIntent = PendingIntent.GetBroadcast(context, 0, active, 0);
remoteViews.SetOnClickPendingIntent(Resource.Id.button, actionPendingIntent);

示例3

var intent = new Intent(context, typeof(WordWidget));
intent.SetAction(AppWidgetManager.ActionAppwidgetUpdate);
intent.PutExtra(AppWidgetManager.ExtraAppwidgetIds, ids);
var piBackground = PendingIntent.GetBroadcast(context, 0, intent, PendingIntentFlags.UpdateCurrent);
remoteViews.SetOnClickPendingIntent(Resource.Id.button, piBackground);

示例4

var intent = new Intent(context, typeof(WordWidget));
intent.SetAction("test");
remoteViews.SetOnClickPendingIntent(Resource.Id.button, PendingIntent.GetBroadcast(context, 0, intent, 0));

示例5

Intent intent = new Intent(Intent.ActionView, Android.Net.Uri.Parse("https://google.com"));
remoteViews.SetOnClickPendingIntent(Resource.Id.button, intent);

我试图用typeof(MainActivity(替换typeof(WordWidget(,但它不起作用。我试着把这些代码放在ListProvider的公共RemoteViewsGetViewAt(int位置(上,在那里构建了项布局,但它不起作用。

作为一个测试,我实现了以下功能:当点击ListView时,进入APP的主页。

您可以参考以下代码:

我们需要调用SetOnClickFillInIntent来区分项目的点击行为。

ListProvider.cs

public RemoteViews GetViewAt(int position)
{
RemoteViews remoteView = new RemoteViews(
context.PackageName, Resource.Layout.list_row);
ListItem listItem = listItemList[position];
remoteView.SetTextViewText(Resource.Id.heading, listItem.heading);
remoteView.SetTextViewText(Resource.Id.content, listItem.content);
// add code here 
Bundle extras = new Bundle();
extras.PutInt("position", position);
Intent fillInIntent = new Intent();
fillInIntent.PutExtras(extras);
// Make it possible to distinguish the individual on-click
// action of a given item
remoteView.SetOnClickFillInIntent(Resource.Id.item_frame, fillInIntent);
return remoteView;
}

注意:这里item_framelist_row.xml的根元素的id

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:id="@+id/item_frame"
android:background="@android:color/darker_gray" >

WidgetProvider.cs

在这里,我们在OnUpdate方法中设置未决意图

public override void OnUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds)
{
base.OnUpdate(context, appWidgetManager, appWidgetIds);
int N = appWidgetIds.Length;
for (int i = 0; i < N; i++)
{
RemoteViews remoteViews = updateWidgetListView(context, appWidgetIds[i]);
// we add code here
Intent activityIntent = new Intent(context, typeof(MainActivity));
// activityIntent.SetPackage(context.PackageName);
// Set the action for the intent.
// When the user touches a particular view.
//activityIntent.PutExtra(AppWidgetManager.ExtraAppwidgetId, appWidgetIds[i]);
//activityIntent.SetData(Android.Net.Uri.Parse(activityIntent.ToUri(Android.Content.IntentUriType.AndroidAppScheme)));
PendingIntent pendingIntent = PendingIntent.GetActivity(context, appWidgetIds[i], activityIntent, PendingIntentFlags.UpdateCurrent);
remoteViews.SetPendingIntentTemplate(Resource.Id.listViewWidget, pendingIntent);

appWidgetManager.UpdateAppWidget(appWidgetIds[i], remoteViews);
}
}

最新更新