AppWidgetProvider:遇到变量

如何解决AppWidgetProvider:遇到变量

| 我已经为主屏幕构建了一个小部件,并在我的appwidgetprovider类中声明了一些变量。这些变量是整数和布尔值。 我遇到的问题(基本上是Java编程问题)是我分配给变量的任何值。当我从主屏幕删除小部件,然后稍后再将小部件添加回主屏幕时,这些变量仍保留着小部件上次进入主屏幕的值。我声明变量如下:
public class MyWidget extends appwidgetprovider {
    static int iPicNum = 0;
    static Boolean bClosed = false;
    ...
每次将小部件从屏幕上删除并将其重新放回屏幕时,如何重置变量的值。或者,如果用户希望在屏幕上拥有一个以上的窗口小部件实例,则这些变量不应在它们之间共享值。它们应该彼此独立。 谢谢 法拉兹·阿扎尔(Faraz Azhar)     

解决方法

        为什么不覆盖
MyWidget
中的
onDeleted()
并在每次调用它时重置您的值(请记住要调用
super.onDeleted()
)。     ,        变量共享值的原因是它们被声明为静态的。在Java中,当您声明一个变量static时,这意味着将永远只有一个实例。以假设的类PolarBear为例。此类可以具有静态的Color变量,设置为\“ white \”。这意味着,每次您请求PolarBear.bearColor时,您都会获得白色。但是,它比这稍微更微妙。您不会每次都得到一个新对象,而会得到一个相同的对象。     ,        如果我已正确理解该问题,则需要为每个窗口小部件实例具有此值的唯一实例。 对于这种行为,您需要将数据存储在静态对象中,并除以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);
        }
    }
}
希望这可以帮助。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?