Переменная уровня приложения - PullRequest
2 голосов
/ 28 декабря 2011

Мне нужно хранить некоторую информацию при входе в систему, которая доступна во всех других действиях в приложении. Я попытался создать отдельный класс как таковой:

public class MyApp : Application
{
    private string siteID;

    public string getSite()
    {
        return siteID;
    }
    public void setSite(string s)
    {
        siteID = s;
    }
}

Настройка идентификатора сайта в моей активности входа в систему:

MyApp ma = new MyApp();
ma.setSite("IT-TEST");

А потом снова попытаться получить значение в другом упражнении:

MyApp ma = new MyApp();
var site = ma.getSite();
Toast.MakeText(this, site, ToastLength.Long)
     .Show();

Но эта часть всегда возвращается пустой. Чего мне не хватает?

Ответы [ 4 ]

5 голосов
/ 28 декабря 2011

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

Один отличный способ хранить простые пары ключ / значение - это использовать встроенную систему предпочтений Android.Из Activity вы можете сделать:

var settings = PreferenceManager.GetDefaultSharedPreferences(ApplicationContext);
var editor = settings.Edit();
editor.PutString("key", "value");
editor.Commit();

var value = settings.GetString("key", null);

Другой метод - создать подкласс Application, который будет действовать как глобальный класс приложения для вашего приложения:

[Application]
public class MyApplication : Application
{
    public static string StaticString { get; set; }

    public string InstanceString { get; set; }

    public MyApplication(IntPtr handle, JniHandleOwnership transfer)
        : base(handle, transfer)
    {
    }
}

будет одним экземпляром этого класса, работающим во всем приложении.Из Activity вы можете получить доступ к данным экземпляра класса, приведя свойство Application действия к вашему пользовательскому классу:

var instanceValue = ((MyApplication) Application).InstanceString;

В качестве альтернативы вы также можете использовать статическое свойство класса, если это лучше работает в вашей ситуации.:

var staticValue = MyApplication.StaticString;
0 голосов
/ 12 апреля 2012

Как указано в ответах на этот (связанный) вопрос , создание подкласса класса приложения не поможет во всех ситуациях, поскольку после повторной активации (из фона) будет создан новый экземпляр, в которомпеременные будут нулевыми вместо вашего сохраненного состояния.

Таким образом, сохранение состояния, как в данном решении предпочтений, является хорошим решением.

0 голосов
/ 28 декабря 2011

Вы пытались сделать класс статичным?

0 голосов
/ 28 декабря 2011

Поскольку вы создали новый экземпляр, где сайт пуст. Вам необходимо сохранить этот первый экземпляр объекта «MyApp», чтобы вернуть сайт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...