Android Widget: Defining a simple boolean variable for a toggle widget
I'm trying to make a very simple toggle switch and I want to store the state of the switch in order to change between states. My current solution is to use a class boolean variable, but the variable does not seem to change.
Source code below. As you can see, it's very simple so far and th开发者_高级运维e touch events are working (that is, the Log statement is initiating every time). When the widget is first placed on the screen, it has the text "Hello!". Once pressed for the first time, this changes to "Ontrue", so clearly isEnabled is being set to true. However, on subsequent presses, Log is showing that isEnabled is false and it continues to execute through the else statement and not the if.
Any help would be appreciated!
package com.mywidget.widget;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
public class MyWidget extends AppWidgetProvider {
public static final String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";
private RemoteViews remoteViews = new RemoteViews("com.mywidget.widget", R.layout.widget1x1);
private boolean isEnabled;
/** Called when the activity is first created. */
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
final int N = appWidgetIds.length;
for (int i = 0; i < N; i++) {
int appWidgetId = appWidgetIds[i];
Intent intent = new Intent(context, MyWidget.class);
intent.setAction(ACTION_WIDGET_RECEIVER);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0,
intent, 0);
remoteViews.setOnClickPendingIntent(R.id.BTNwidget, pendingIntent);
appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
}
}
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION_WIDGET_RECEIVER)) {
Log.i("MyWidget", "Screen pressed! Value is: " + isEnabled);
if (isEnabled) {
// set to off
Log.i("MyWidget", "Setting to off");
// Code to change state
isEnabled = false;
// Update the widget to reflect our changes
remoteViews.setTextViewText(R.id.BTNwidget, "OFF" + isEnabled);
ComponentName cn = new ComponentName(context, HapticWidget.class);
AppWidgetManager.getInstance(context).updateAppWidget(cn, remoteViews);
} else {
// set to on
Log.i("MyWidget", "Setting to on");
// Code to change state
isEnabled = true;
// Update the widget to reflect our changes
remoteViews.setTextViewText(R.id.BTNwidget, "ON" + isEnabled);
ComponentName cn = new ComponentName(context, HapticWidget.class);
AppWidgetManager.getInstance(context).updateAppWidget(cn, remoteViews);
}
}
super.onReceive(context, intent);
}
}
AppWidgetProvider
is a BroadcastReceiver
, and as such its life lasts as long as the onReceive()
method. Your boolean keeps getting reinitialized to the default false at every touch.
You could try making isEnabled
static, but you never know when the process (and VM) that run the receiver will get killed (actually I'm not even sure that it would work at all). So your best chance is to use some storage, SharedPreferences
would be fine I think.
精彩评论