2016-09-26 56 views
1

我正在构建一个支持ViewFlipper的集合小部件,并且在遵循adding behavior to individual items上的Android文档时遇到了障碍。在ViewFlipper小部件中的单个元素上设置点击监听器

我要创建两个箭头,移动ViewFlipper到以前的和未来的看法,如本样机:

enter image description here

在我WidgetServicegetViewAt()方法,我有以下代码在意图创建一个填充:

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。如果我确定每个按钮的意图,我需要一种方法来确定我的WidgetProvideronUpdate方法(我现在拥有的是ViewFlipper中的视图位置)中单击了哪个按钮。我不能找到一个Widget的例子,不幸的是,它使用点击监听器进行多个动作。

+1

只是想给一些反馈:您链接到说:“你RemoteViewsFactory必须设置文本填空题上的collection.This每个项目的意图,能够区分给定物品的单独点击动作。“所以我认为你不能在按钮上设置填充意图(它们是项目的子项),就像这样。 – 0X0nosugar

+0

@ 0X0nosugar感谢您的采访,从文档看来您似乎是对的。但是,我确实有一个使用带有多个按钮的ViewFlipper的小部件示例。如果只有我可以达到他们的源代码峰值:( –

回答

1

您链接到的文档与下面的语句有点误导:

你RemoteViewsFactory必须在collection.This每个项目设定一个填空题意图能够区分各个在单击某一项目的行动

那么,你永远不知道,直到你尝试:有可能毕竟设置填充式意图对个别孩子的RemoteViews我TEM。但是您必须为每个按钮使用单独的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()值,并相应地更新应用部件。例如,如果“NEXT”被点击:

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); 
} 
+0

这是非常好的,谢谢一吨! –

相关问题