在ViewFlipper小部件中的单个元素上设置单击侦听器

时间:2016-09-26 15:56:47

标签: android android-widget viewflipper

我正在构建一个由ViewFlipper支持的集合Widget,并且在关注adding behavior to individual items上的Android文档时遇到了障碍。

我想创建两个箭头,将ViewFlipper移动到上一个和下一个视图,如此模型中所示:

enter image description here

在我的WidgetService getViewAt()方法中,我有以下代码来创建填充意图:

final Intent fillInIntent = new Intent();
final Bundle bundle = new Bundle();
bundle.putInt(WidgetProvider.EXTRA_ID, mWidgetItems.get(position));
fillInIntent.putExtras(bundle);
remoteViews.setOnClickFillInIntent(R.id.btn_widget_next, fillInIntent);
remoteViews.setOnClickFillInIntent(R.id.btn_widget_previous, fillInIntent);

然后在我的WidgetProvider我有这个:

// Adding collection list item handler
final Intent onItemClick = new Intent(context, WidgetProvider.class);
onItemClick.setAction(NAVIGATE);
onItemClick.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, id)
onItemClick.setData(Uri.parse(onItemClick.toUri(Intent.URI_INTENT_SCHEME)));
final PendingIntent onClickPendingIntent = PendingIntent
  .getBroadcast(context, id, onItemClick,
     PendingIntent.FLAG_UPDATE_CURRENT);
rv.setPendingIntentTemplate(R.id.widget_view_flipper, onClickPendingIntent);

让我对这里的设计感到困惑的是,我是否应该在每个按钮上调用setOnClickFillInIntent。如果我确实在每个按钮上设置了意图,我需要一种方法来确定在WidgetProvider的{​​{1}}方法中点击了哪个按钮(我现在所拥有的只是视图的位置) onUpdate)。我无法找到一个Widget的例子,不幸的是,它使用点击监听器进行多个操作。

1 个答案:

答案 0 :(得分:1)

您链接到的文档对以下句子有点误导:

  

您的RemoteViewsFactory必须为集合中的每个项目设置填充意图。这样就可以区分给定项目的单个点击操作

嗯,直到你尝试才真正知道:毕竟可以在RemoteViews项目的各个孩子上设置填充意图。但是你必须为每个按钮使用单独的Intent。我将展示如何使用NEXT按钮:

final Intent fillInIntent = new Intent();
final Bundle bundle = new Bundle();
bundle.putInt(WidgetProvider.EXTRA_ID, mWidgetItems.get(position));
bundle.putBoolean("FLIP_TO_NEXT", true);
fillInIntent.putExtras(bundle);
remoteViews.setOnClickFillInIntent(R.id.btn_widget_next, fillInIntent);

然后,您必须检查Intent操作(导航)以及intent.getBooleanExtra("FLIP_TO_NEXT", false)onReceive()的值,并相应地更新应用小部件。例如,如果单击“下一步”:

ComponentName me = new ComponentName(this, ViewFlipperWidget.class);
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(this); 
int appWidgetID = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);
if (appWidgetID != AppWidgetManager.INVALID_APPWIDGET_ID)
{
     RemoteViews rv = new RemoteViews(getPackageName(), R.layout.view_flipper_widget);
     if (intent.getBooleanExtra("FLIP_TO_NEXT", false))
     {
          rv.showNext(R.id.viewFlipper);
     }
     else 
     {
          rv.showPrevious(R.id.viewFlipper);
     }
     appWidgetManager.updateAppWidget(appWidgetID, rv);
}