Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xamarin Forms Sharedpreferences cross

I'd like to know what is the best solution to manipulate application settings in a cross-platform way.

In iOS we can change the settings outside the app in the settings screen, but we don't have that in windows phone and android.

So, my idea is to create a normal page/screen inside the app that shows all my application settings and have an interface with Save() and Get() methods that I can implement specific per device using DependencyServices.

Is this the right way to do it?

like image 724
user1845593 Avatar asked Aug 28 '15 10:08

user1845593


2 Answers

  1. The Application subclass has a static Properties dictionary which can be used to store data. This can be accessed from anywhere in your Xamarin.Forms code using Application.Current.Properties.
Application.Current.Properties ["id"] = someClass.ID;

if (Application.Current.Properties.ContainsKey("id"))
{
    var id = Application.Current.Properties ["id"] as int;
    // do something with id
}

The Properties dictionary is saved to the device automatically. Data added to the dictionary will be available when the application returns from the background or even after it is restarted. Xamarin.Forms 1.4 introduced an additional method on the Application class - SavePropertiesAsync() - which can be called to proactively persist the Properties dictionary. This is to allow you to save properties after important updates rather than risk them not getting serialized out due to a crash or being killed by the OS.

https://developer.xamarin.com/guides/cross-platform/xamarin-forms/working-with/app-lifecycle/

  1. Xamarin.Forms plugin which uses the native settings management.

    • Android: SharedPreferences
    • iOS: NSUserDefaults
    • Windows Phone: IsolatedStorageSettings
    • Windows Store / Windows Phone RT: ApplicationDataContainer

https://github.com/jamesmontemagno/Xamarin.Plugins/tree/master/Settings

like image 76
Daniel Luberda Avatar answered Nov 26 '22 17:11

Daniel Luberda


I tried using the Application.Current.Properties Dictionary and had implementation problems.

A solution that worked with very little effort was James Montemagno's Xam.Plugin.Settings NuGet. GitHub Installing the NuGet automagically creates a Helpers folder with Settings.cs. To create a persisted setting you do:

    private const string QuestionTableSizeKey = "QuestionTableSizeKey";
    private static readonly long QuestionTableSizeDefault = 0;

and

    public static long QuestionTableSize
    {
        get
        {
            return AppSettings.GetValueOrDefault<long>(QuestionTableSizeKey, QuestionTableSizeDefault);
        }
        set
        {
            AppSettings.AddOrUpdateValue<long>(QuestionTableSizeKey, value);
        }
    }

Access and setting in the app then looks like:

namespace XXX
{
    class XXX
    {
        public XXX()
        {
                long myLong = 495;
                ...
                Helpers.Settings.QuestionTableSize = myLong;
                ...
                long oldsz = Helpers.Settings.QuestionTableSize;                   
        }
    }

}
like image 26
heights1976 Avatar answered Nov 26 '22 17:11

heights1976