单击在 android 应用中用户添加的小部件上不起作用

Click not working on widgets added by user with in android app

我允许用户通过打开小部件 intentselect 小部件列表中的小部件

 public void initAppWidget() {
    try {
        mAppWidgetManager = AppWidgetManager.getInstance(this);
        mAppWidgetHost = new AppWidgetHost(this, Constants.APPWIDGET_HOST_ID);

    } catch
            (Exception e) {
        e.printStackTrace();
    }
}

public void selectWidget() {
    int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
    Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
    pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
    startActivityForResult(pickIntent, Constants.SELECT_APPWIDGET);
}

onActivityResult 将在用户 select 从列表

中选择小部件时调用
 @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {

        case Constants.SELECT_APPWIDGET:
            if (resultCode == RESULT_OK) {
                configureWidget(data);

            } else if (resultCode == RESULT_CANCELED && data != null) {
                int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
                if (appWidgetId != -1) {
                    mAppWidgetHost.deleteAppWidgetId(appWidgetId);
                }
            }
            break;

        case Constants.REQUEST_CREATE_APPWIDGET:
            if (resultCode == RESULT_OK) {
                createWidget(data);

            } else if (resultCode == RESULT_CANCELED && data != null) {
                int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
                if (appWidgetId != -1) {
                    mAppWidgetHost.deleteAppWidgetId(appWidgetId);
                }
            }

            break;
    }
}

 public void configureWidget(Intent data) {
    Bundle extras = data.getExtras();
    int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);

    if (appWidgetInfo.configure != null) {
        Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_CONFIGURE);
        intent.setComponent(appWidgetInfo.configure);
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
        startActivityForResult(intent, Constants.REQUEST_CREATE_APPWIDGET);
    } else {
        createWidget(data);
    }
}

最后createWidget函数将widget视图添加到线性布局

public void createWidget(Intent data) {
    int appWidgetId = data.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, -1);
    AppWidgetProviderInfo appWidgetInfo = mAppWidgetManager.getAppWidgetInfo(appWidgetId);

    AppWidgetHostView hostView = mAppWidgetHost.createView(this, appWidgetId, appWidgetInfo);
    hostView.setAppWidget(appWidgetId, appWidgetInfo);
    hostView.setId(id);
    ll_widgets_list.addView(hostView);
    id++;
}

但是有些小部件没有点击,例如模拟时钟。 google 驱动器等一些小部件包含其他视图,这些视图可点击且工作正常。每当用户通过它执行任何操作时,小部件都不会更新。

mAppWidgetHost.startListening();

侦听小部件更改的 initAppWidget() 函数中缺少此行。