应用级变量

时间:2011-12-28 13:51:05

标签: c# android xamarin.android

我需要在登录时存储一些可用于应用程序中其他活动的信息。我试过创建一个单独的类:

public class MyApp : Application
{
    private string siteID;

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

在我的登录活动中设置网站ID:

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

然后尝试在其他活动中稍后再次获取该值:

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

但这部分总是返回空白。我错过了什么?

4 个答案:

答案 0 :(得分:5)

问题是你每次都要实例化一个MyApp的实例,所以那里没有数据持久性。有很多方法可以在应用程序中共享数据,但是您可以使用几种方法。

存储简单键/值对的一个好方法是使用Android的内置首选项系统。在您可以执行的活动中:

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;

答案 1 :(得分:0)

因为您已经创建了一个新实例,其中该网站为null。您需要存储“MyApp”对象的第一个实例才能恢复该网站。

答案 2 :(得分:0)

你试过让这个课静止吗?

答案 3 :(得分:0)

this (related) question的答案中所述,继承应用程序类将无助于所有情况,因为在重新激活(从后台)后将创建一个新实例,其中变量将为null而不是你保存的状态。

因此,在给定的偏好解决方案中保存状态是一个很好的解决方案。