我正在构建一个由ViewFlipper
支持的集合Widget,并且在关注adding behavior to individual items上的Android文档时遇到了障碍。
我想创建两个箭头,将ViewFlipper
移动到上一个和下一个视图,如此模型中所示:
在我的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的例子,不幸的是,它使用点击监听器进行多个操作。
答案 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);
}