我制作了一个简单的主屏幕小部件,它有两个TextView字段和一个刷新按钮。 TextViews是从AsyncTask加载的,它可以下载和解析小型XML文件。刷新按钮再次调用onUpdate(使用PendingIntent),最后再次调用AsyncTask。我有一个简单的模型类XMLValues,它可以存储XML中的解析值(并在AppWidgetProvider类中初始化:
public class XmlValues {
private int mFieldValue1;
public int getFieldValue1() {
return mFieldValue1;
}
public void setFieldValue1(int FieldValue) {
mFieldValue1 = FieldValue;
private int mFieldValue2;
public int getFieldValue2() {
return mFieldValue2;
}
public void setFieldValue2(int FieldValue) {
mFieldValue2 = FieldValue;
}
}
在下载和解析XML的AsyncTask(我传入RemoteViews视图,int appWidgetID,AppWidgetManager appWidgetManager)中,postExecute方法如下所示:
protected void onPostExecute(XmlValues xv) {
if (isCancelled()) {
xv = null;
}
views.setTextViewText(R.id.textView1, xv.getFieldValue1());
views.setTextViewText(R.id.textView2, xv.getFieldValue1());
WidgetManager.updateAppWidget(WidgetID, views);
}
这一切都有效(我用正确的值加载TextViews),但是我仍然试图执行以下操作 - 因为我正在解析的XML值可能会发生变化,我希望(例如)更改颜色如果来自新XML的新值大于小部件中的当前值,则为TextView。我怎样才能做到这一点?我试着四处寻找,但没有设法从AsyncTask的onPostExecute方法中找到如何影响在主窗口小部件类中创建的模型类对象。
答案 0 :(得分:0)
您可以使用static int字段存储最后一个值:
private static int lastValue1 = -1; // you can use other initial value
private static int lastValue2 = -1;
然后您可以使用它,例如:
if( lastValue1 < xv.getFieldValue1() ) {
lastValue1 = xv.getFieldValue1();
views.setTextViewText(R.id.textView1, xv.getFieldValue1());
}
// the same for second value.
另一种解决方案是将最后一个值存储在SharedPreferenced中。