Android 多个Widget使用GridView实现子view点击事件如何区分AppWidgetId
void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
Log.i("ceshi", "updateAppWidget: ...appWidgetId==" + appWidgetId);
initData();
CharSequence widgetText = context.getString(R.string.appwidget_text);
// Construct the RemoteViews object
views = new RemoteViews(context.getPackageName(), R.layout.huarong_widget);
/*设置响应 “GridView(gridview)” 的intent模板
说明:“集合控件(如GridView、ListView、StackView等)”中包含很多子元素,如GridView包含很多格子。
它们不能像普通的按钮一样通过 setOnClickPendingIntent 设置点击事件,必须先通过两步。
(01) 通过 setPendingIntentTemplate 设置 “intent模板”,这是比不可少的!
(02) 然后在处理该“集合控件”的RemoteViewsFactory类的getViewAt()接口中 通过 setOnClickFillInIntent 设置“集合控件的某一项的数据”
*/
Intent gridIntent = new Intent();
gridIntent.setAction(COLLECTION_VIEW_ACTION);
gridIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, gridIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// 设置intent模板
views.setPendingIntentTemplate(R.id.grid_photo, pendingIntent);
Intent serviceIntent = new Intent(context, GridWidgetService.class);//通过GridWidgetService对gridview进行管理
views.setRemoteAdapter(R.id.grid_photo, serviceIntent);
Log.i(TAG, "updateAppWidget: serviceIntent==" + serviceIntent);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
} void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
int appWidgetId) {
Log.i("ceshi", "updateAppWidget: ...appWidgetId==" + appWidgetId);
initData();
CharSequence widgetText = context.getString(R.string.appwidget_text);
// Construct the RemoteViews object
views = new RemoteViews(context.getPackageName(), R.layout.huarong_widget);
/*设置响应 “GridView(gridview)” 的intent模板
说明:“集合控件(如GridView、ListView、StackView等)”中包含很多子元素,如GridView包含很多格子。
它们不能像普通的按钮一样通过 setOnClickPendingIntent 设置点击事件,必须先通过两步。
(01) 通过 setPendingIntentTemplate 设置 “intent模板”,这是比不可少的!
(02) 然后在处理该“集合控件”的RemoteViewsFactory类的getViewAt()接口中 通过 setOnClickFillInIntent 设置“集合控件的某一项的数据”
*/
Intent gridIntent = new Intent();
gridIntent.setAction(COLLECTION_VIEW_ACTION);
gridIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, gridIntent, PendingIntent.FLAG_UPDATE_CURRENT);
// 设置intent模板
views.setPendingIntentTemplate(R.id.grid_photo, pendingIntent);
Intent serviceIntent = new Intent(context, GridWidgetService.class);//通过GridWidgetService对gridview进行管理
views.setRemoteAdapter(R.id.grid_photo, serviceIntent);
Log.i(TAG, "updateAppWidget: serviceIntent==" + serviceIntent);
// Instruct the widget manager to update the widget
appWidgetManager.updateAppWidget(appWidgetId, views);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
// There may be multiple widgets active, so update all of them
for (int appWidgetId : appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId);
}
}
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Ceshi", "onReceive: ...==" + intent.getAction() +" intent=" + intent);
super.onReceive(context, intent);
String action = intent.getAction();
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
if (action.equals(COLLECTION_VIEW_ACTION)) {
// views = new RemoteViews(context.getPackageName(), R.layout.huarong_widget);
int appWidgetId = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
Log.i(TAG, "onReceive: appWidgetId =" + appWidgetId);
appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId,R.id.grid_photo);
int clickPosition = intent.getIntExtra(COLLECTION_VIEW_EXTRA, -1);
SharedPreferences sharedPreferences = context.getSharedPreferences("Click", Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sharedPreferences.edit();
edit.putInt("click_position", clickPosition);
edit.commit();
Log.i(TAG, "onReceive: ====" + clickPosition);
// int position = intent.getIntExtra(COLLECTION_VIEW_EXTRA, -1);
// Intent serviceIntent = new Intent(context, GridWidgetService.class);//通过GridWidgetService对gridview进行管理
// serviceIntent.putExtra("clickPosition", 2);
// views = new RemoteViews(context.getPackageName(), R.layout.huarong_widget);
// views.setRemoteAdapter(R.id.grid_photo, serviceIntent);
}
}
为何onReceiver当中接收点击事件时,appWidgetId总是为最后一个widget的AppWidgetId?导致我创建多个widget时,无论点击哪一个的GridView的itemView响应的总是最后一个widget.