从buttons
标识旁边的两个activity
更新很容易,因为我从AppWidgetProvider
获得了来自onUpdate方法的appWidgetId,但imagebuttons
列表中的RemoteViewsFactory
方法在getViewAt()
方法中创建。
@Override
public RemoteViews getViewAt(int position) {
RemoteViews row = new RemoteViews(ctxt.getPackageName(), R.layout.list_row_widget);
row.setTextViewText(R.id.tvDescription, items.get(position).name);
Intent i = new Intent();
Bundle extras = new Bundle();
extras.putBoolean(TimeWidgetProvider.ACTION_WORK_START, true);
extras.putInt(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
i.putExtras(extras);
row.setOnClickFillInIntent(R.id.btnStartWork, i);
return (row);
}
所以每个人都有相同的id(R.id.btnStartWork),同样的appWidgetId不是行id,而是整个widget ID。
我需要在我点击的行中更改图像按钮,但因为我在Activity中只有一个appwidget id,而且每次使用时都是整个小部件:
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getBaseContext());
RemoteViews views = new RemoteViews(getBaseContext().getPackageName(), R.layout.widget_layout);
views.setImageViewResource(R.id.btnStartWork, R.drawable.button_active);
appWidgetManager.updateAppWidget(mAppWidgetId, views);
它会更改第一个图像按钮而不是所选按钮。
我试图从工厂传递远程视图行,但它没有用,因为我打电话时
appWidgetManager.updateAppWidget(mAppWidgetId, row);
使用整个窗口小部件的id,窗口小部件消失了,只有选定的行可见。我可以在列表中获取项目的位置,但它没有帮助,因为它不是viewId。 我已阅读了许多教程,包括:http://developer.android.com/guide/topics/appwidgets/index.html
但仍未找到答案,这是我的第一个小部件。请帮助。
谢谢;)
答案 0 :(得分:0)
实际上解决方案非常简单,在getViewAt()
方法中保存每个imagebutton
到extras
的位置:
extras.putInt(TimeWidgetProvider.POSITION, position);
然后在处理方法存储某处所选项目的索引
TimeWidgetProvider.selected = extras.getInt(TimeWidgetProvider.POSITION);
之后,请使用:
appWidgetManager.notifyAppWidgetViewDataChanged(mAppWidgetId, R.id.list);
最后再次在您之前存储的索引的getViewAt()
方法更改imagebutton
中。
if (position == TimeWidgetProvider.selected) {
row.setImageViewResource(R.id.btnStartWork, R.drawable.button_active);
} else {
row.setImageViewResource(R.id.btnStartWork, R.drawable.button_inactive);
}
使用所选项目的更改状态刷新整个列表。
此解决方案的Tamás Müller。