AppWidgetProvider:遇到变量问题

时间:2011-06-15 05:28:48

标签: java android eclipse android-widget android-appwidget

我为主屏幕构建了一个小部件,并在我的AppWidgetProvider类中声明了一些变量。这些变量是整数和布尔值。

我遇到的问题(它基本上是一个java编程问题)是我分配给我的变量的任何值;当我从主屏幕删除小部件然后稍后我将小部件添加回主屏幕时,变量仍然保持上次小部件在主屏幕上的值。我声明变量如下:

public class MyWidget extends AppWidgetProvider {
    static int iPicNum = 0;
    static Boolean bClosed = false;
    ...

每次从屏幕上移除小部件并将其重新放回屏幕时,如何重置变量的值。或者,如果用户希望在屏幕上具有多个小部件实例,则变量不应在它们之间共享值。它们应该彼此独立。

谢谢 Faraz Azhar

3 个答案:

答案 0 :(得分:0)

为什么不覆盖onDeleted()中的MyWidget并在调用此值时重置您的值(请记得尽快调用super.onDeleted()。)

答案 1 :(得分:0)

变量共享值的原因是它们被声明为静态。在Java中,当您声明一个变量static时,这意味着它只会有一个实例。以一个假设的类PolarBear为例。这个类可以有一个静态Color变量,设置为“white”。这意味着每次你要求PolarBear.bearColor时,你都会得到白色。虽然它稍微有点微妙。您不会获得 new 对象,每次都会获得相同的对象。

答案 2 :(得分:0)

如果我已正确理解了该问题,则需要为每个窗口小部件实例提供此值的唯一实例。

对于此类行为,您需要将数据存储在静态对象中,除以appWidgetId。至于我,最好的方法是使用自定义对象的静态HashMap,如下所示:

private static class MyValues{
    private final int iPicNum = 0;
    private final boolean bClosed = false;

    public MyValues(int iPicNum, boolean bClosed) {
        this.iPicNum = iPicNum;
        this.bClosed = bClosed;
    }
    public int getiPicNum() {
        return iPicNum;
    }
    public boolean isbClosed() {
        return bClosed;
    }        
}

在AppWidgetProvider类中:

private static HashMap<int,MyValues> mValues = new HashMap<int,MyValues>;

当您第一次需要为窗口小部件保存一些数据时:

mValues.put(appWidetId, new MyValues(iPicNum,bClosed);

获取数据:

MyValues values = mValues.get(appWidgetId);
if (values != null){
   int iPicNum = values.getiPicNum();
   boolean bClosed = values.isbClosed();
}

并且不要忘记在onDeleted()方法中清除未使用的数据(当从屏幕上删除单个窗口小部件时调用它):

public void onDeleted(Context context, int[] appWidgetIds) {
    for (int appWidgetId : appWidgetIds) {
        if (appWidgetId != -1) {
            mValues.remove(appWidgetId);
        }
    }
}

希望这会有所帮助。