开发者

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜