java - 如何创建一个按下时改变颜色的小部件?
问题描述
我有一个 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 的自定义实现。
解决方案
推荐阅读
- android - 使用几张jpg图片时,c++builder android找不到资源
- gnuplot - 如何在 GNUPlot 的箱形图中使 xtics 标签颜色变量?
- javascript - 为什么在尝试使单选按钮看起来像表单上的按钮时 CSS 不起作用?
- python - Django删除项目用例:好的做法?
- django - 如何制作依赖于另一个模态的主键的“GET”视图
- rest - 缺少父资源时选择哪个 HTTP 代码
- ruby-on-rails - Rails:在迁移中重命名列失败
- javascript - 我怎样才能 ReactDOM.render() 将多个反应元素放入一个节点而不互相杀死?
- java - hashset的打印元素顺序
- python - 使用 python 烧瓶通过 Azure 应用洞察轻松获取异常