AppWidgetProvider: возникли проблемы с переменными - PullRequest
3 голосов
/ 15 июня 2011

Я создал виджет для домашнего экрана и объявил некоторые переменные в своем классе AppWidgetProvider.Эти переменные являются целыми числами и логическими значениями.

Проблема, с которой я столкнулся (в основном это проблема программирования Java), заключается в том, что любое значение, которое я назначаю своим переменным;Когда я удаляю виджет с главного экрана, а затем позже, через некоторое время, добавляю виджет обратно на главный экран, переменные по-прежнему сохраняют значения с момента последнего отображения виджета на главном экране.Я объявляю переменные следующим образом:

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

Как мне сбрасывать значения моих переменных каждый раз, когда виджет удаляется с экрана, и снова возвращать его на экран.Или, если пользователь желает иметь более одного экземпляра виджета на экране, переменные не должны делиться значениями между ними.Они должны быть независимы друг от друга.

Спасибо, Фараз Азар

Ответы [ 3 ]

0 голосов
/ 21 июня 2011

Причина, по которой переменные имеют общие значения, заключается в том, что они объявлены статическими. В Java, когда вы объявляете переменную static, это означает, что будет только один ее экземпляр. Взять хотя бы гипотетический класс PolarBear. Этот класс может иметь статическую переменную Color, установленную на «white». Это означает, что каждый раз, когда вы запрашиваете PolarBear.bearColor, вы возвращаете белый цвет. Это немного тоньше, чем это, хотя. Вы не получите новый объект, вы получите один и тот же объект каждый раз.

0 голосов
/ 22 мая 2013

Если я правильно понял проблему, вам нужно иметь уникальные экземпляры этих значений для каждого экземпляра виджета.

Для такого поведения вам нужно хранить данные в статическом объекте, разделенном на 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);
        }
    }
}

Надеюсь, это поможет.

0 голосов
/ 21 июня 2011

Почему бы не переопределить onDeleted() в MyWidget и сбрасывать значения при каждом вызове (хотя не забывайте вызывать super.onDeleted()).

...