首页 > 解决方案 > 如何创建一个按下时改变颜色的小部件?

问题描述

我有一个 ImageButton 作为小部件。它有两个可绘制的 src 图像,一个用于 ON 状态,一个用于 OFF 状态。这是我对这个 App Widget 的实现:

public class OnOffWidget extends AppWidgetProvider {

    private static final String MyOnClick = "myOnClickTag";

    @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);
        }
    }

    public void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                                int appWidgetId) {

        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.on_off_widget);
        Intent intent = new Intent(context, getClass());
        intent.setAction(MyOnClick);
        intent.putExtra("appWidgetId", appWidgetId);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
        views.setOnClickPendingIntent(R.id.appwidget_button, pendingIntent);

        final MyModulePreference defaultModulePreference = new MyModulePreference(context, "defaultPrefs", 1);
        if (defaultModulePreference.getBoolean("app_enabled", true)) {
            views.setImageViewResource(R.id.appwidget_button, R.drawable.widget_on);
        } else {
            views.setImageViewResource(R.id.appwidget_button, R.drawable.widget_off);
        }

        Log.i("TAG","real widget id: " + appWidgetId);

        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    }

    @Override
    public void onReceive(Context context, Intent intent) {

        if (MyOnClick.equals(intent.getAction())) {
            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.on_off_widget);
            final MyModulePreference defaultModulePreference = new MyModulePreference(context, "defaultPrefs", 1);
            if (defaultModulePreference.getBoolean("app_enabled", true)) {
                defaultModulePreference.put("app_enabled", false);
                views.setImageViewResource(R.id.appwidget_button, R.drawable.widget_off);
            } else {
                defaultModulePreference.put("app_enabled", true);
                views.setImageViewResource(R.id.appwidget_button, R.drawable.widget_on);
            }
            int appWidgetId = intent.getIntExtra("appWidgetId", -1);

            Log.i("TAG","received widget id: " + appWidgetId); //appWidgetId is always -1 here
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }

        super.onReceive(context, intent);
    }

    @Override
    public void onEnabled(Context context) {
        
    }

    @Override
    public void onDisabled(Context context) {
        
    }
}

如您所见,我正在尝试更改内部 ImageButton 的可绘制对象,onReceive()以便在按下小部件时更改。但它不起作用的原因有一个:我无法进入appWidgetId内部onReceive()。我放入intent.putExtra("appWidgetId", appWidgetId);了更新方法,为什么它不起作用?

注意:MyModulePreference只是 SharedPreferences 的自定义实现。

标签: javaandroid

解决方案


推荐阅读