Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 应用程序级变量_C#_Android_Xamarin.android - Fatal编程技术网

C# 应用程序级变量

C# 应用程序级变量,c#,android,xamarin.android,C#,Android,Xamarin.android,我需要在登录时存储一些信息,这些信息可以在应用程序的其他活动中使用。我已经尝试创建一个单独的类: public class MyApp : Application { private string siteID; public string getSite() { return siteID; } public void setSite(string s) { siteID = s; } } 在我的登录活

我需要在登录时存储一些信息,这些信息可以在应用程序的其他活动中使用。我已经尝试创建一个单独的类:

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();
然后在以后的另一个活动中再次尝试获取该值:

MyApp ma = new MyApp();
ma.setSite("IT-TEST");
MyApp ma = new MyApp();
var site = ma.getSite();
Toast.MakeText(this, site, ToastLength.Long)
     .Show();

但是这个部分总是返回空白。我缺少什么?

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

您是否尝试过将类设置为静态?

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

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

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

var value = settings.GetString("key", null);
另一种方法是子类化
应用程序
,它将在整个应用程序中充当全局应用程序类:

[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)
    {
    }
}
根据设计,这个类的一个实例将在整个应用程序中运行。通过将活动的应用程序属性强制转换到自定义类,可以从活动访问类上的实例数据:

var instanceValue = ((MyApplication) Application).InstanceString;
或者,如果静态属性更适合您的情况,也可以对类使用静态属性:

var staticValue = MyApplication.StaticString;

正如的答案中所述,子类化应用程序类在所有情况下都不会有帮助,因为在重新激活(从后台)后将创建一个新实例,其中变量将为null,而不是保存的状态


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

我还没有真正研究Monodroid,但搜索似乎表明这可能对您更有利:它确实存在于Monodroid上:谢谢。尝试你的第一个建议,但我一直得到“名称ApplicationContext在当前上下文中不存在”我应该放在那里什么?你从哪里调用它?如果调用类从上下文继承(活动和应用程序都继承)Nevermind,则也可以只传入“this”。用这个替换了ApplicationContext,它可以正常工作。谢谢