Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6644939
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: Android平台

2017-10-10 20:36:39

设置允许将配置应用程序行为的数据与代码分离,允许在不重新构建应用程序的情况下更改行为。有两种类型的设置:应用设置和用户设置。

应用设置是应用程序创建和管理的数据。它可以包括固定Web服务端点,API密钥和运行时状态等数据。应用设置与应用的存在有关,只对该应用有意义。

用户设置是影响应用行为的应用的可自定义设置,不需要频繁的重新调整。例如,应用程序可能会让用户指定从哪里检索数据,以及如何在屏幕上显示数据。

Xamarin.Forms包含可用于存储设置数据的持久字典。可以使用Application.Current.Properties属性访问此字典,并且在应用进入睡眠状态时保存放入其中的任何数据,并在应用程序恢复或重新启动时恢复。此外,Application类还具有一个SavePropertiesAsync方法,允许应用程序在需要时保存其设置。有关此字典的更多信息,请参阅Xamarin开发人员中心的

使用Xamarin.Forms持久性字典存储数据的缺点是它不容易被数据绑定。因此,eShopOnContainers手机应用程序使用可从NuGet获取的Xam.Plugins.Settings库。在使用每个平台提供的本地设置管理的同时,该库提供一致的,类型安全的跨平台方法,用于持久化和检索应用程序和用户设置。此外,使用数据绑定访问库公开的设置数据是直接的。

注意:虽然Xam.Plugin.Settings库可以存储应用程序和用户设置,但两者之间没有区别。

创建一个设置类

当使用Xam.Plugins.Settings库时,应创建一个静态类,该类将包含应用程序所需的应用程序和用户设置。 以下代码示例显示了eShopOnContainers移动应用程序中的Settings类:


点击(此处)折叠或打开

  1. public static class Settings
  2. {
  3.     private static ISettings AppSettings
  4.     {
  5.         get
  6.         {
  7.             return CrossSettings.Current;
  8.         }
  9.     }
  10.     ...
  11. }


可以通过由Xam.Plugins.Settings库提供的ISettings API读取和写入设置。 该库提供了一个可用于访问API的单例,CrossSettings.Current,应用程序的设置类应通过ISettings属性公开此单例。

注意:使用Plugin.Settings和Plugin.Settings.Abstractions命名空间的指令应该添加到需要访问Xam.Plugins.Settings库类型的类中。

添加设置

每个设置由一个键,一个默认值和一个属性组成。 以下代码示例显示了用于设置eShopOnContainers移动应用程序连接到的在线服务的基本URL的用户设置的所有三个项目:


点击(此处)折叠或打开

  1. public static class Settings
  2. {
  3.     ...
  4.     private const string IdUrlBase = "url_base";
  5.     private static readonly string UrlBaseDefault = GlobalSetting.Instance.BaseEndpoint;
  6.     ...

  7.     public static string UrlBase
  8.     {
  9.         get
  10.         {
  11.             return AppSettings.GetValueOrDefault<string>(IdUrlBase, UrlBaseDefault);
  12.         }
  13.         set
  14.         {
  15.             AppSettings.AddOrUpdateValue<string>(IdUrlBase, value);
  16.         }
  17.     }
  18. }


键始终是定义键名称的常量字符串,设置的默认值是所需类型的静态可读值。 如果检索到未设置的设置,则提供默认值可确保有效值可用。

UrlBase static属性使用ISettings API中的两个方法来读取或写入设置值。 ISettings.GetValueOrDefault方法用于从平台特定的存储中检索设置的值。 如果没有为该设置定义值,则会检索其默认值。 类似地,ISettings.AddOrUpdateValue方法用于将设置的值持续到平台特定的存储。

而是在Settings类中定义默认值,UrlBaseDefault字符串从GlobalSetting类获取其值。 以下代码示例显示了此类中的BaseEndpoint属性和UpdateEndpoint方法:


点击(此处)折叠或打开

  1. public class GlobalSetting
  2. {
  3.     ...
  4.     public string BaseEndpoint
  5.     {
  6.         get { return _baseEndpoint; }
  7.         set
  8.         {
  9.             _baseEndpoint = value;
  10.             UpdateEndpoint(_baseEndpoint);
  11.         }
  12.     }
  13.     ...

  14.     private void UpdateEndpoint(string baseEndpoint)
  15.     {
  16.         RegisterWebsite = string.Format("{0}:5105/Account/Register", baseEndpoint);
  17.         CatalogEndpoint = string.Format("{0}:5101", baseEndpoint);
  18.         OrdersEndpoint = string.Format("{0}:5102", baseEndpoint);
  19.         BasketEndpoint = string.Format("{0}:5103", baseEndpoint);
  20.         IdentityEndpoint = string.Format("{0}:5105/connect/authorize", baseEndpoint);
  21.         UserInfoEndpoint = string.Format("{0}:5105/connect/userinfo", baseEndpoint);
  22.         TokenEndpoint = string.Format("{0}:5105/connect/token", baseEndpoint);
  23.         LogoutEndpoint = string.Format("{0}:5105/connect/endsession", baseEndpoint);
  24.         IdentityCallback = string.Format("{0}:5105/xamarincallback", baseEndpoint);
  25.         LogoutCallback = string.Format("{0}:5105/Account/Redirecting", baseEndpoint);
  26.     }
  27. }


每次设置BaseEndpoint属性时,都会调用UpdateEndpoint方法。 此方法更新一系列属性,所有这些属性都基于由“设置”类提供的UrlBase用户设置,这些设置表示eShopOnContainers移动应用程序连接到的不同端点。

数据绑定到用户设置

eShopOnContainers手机应用程序中,SettingsView显示两个用户设置。 这些设置允许配置应用程序是否从部署为Docker容器的微服务中检索数据,还是应用程序是否应从不需要Internet连接的模拟服务中检索数据。 当选择从容器化的微服务检索数据时,必须指定微服务器的基本端点URL。 图7-1显示了用户选择从容器式微服务检索数据时的SettingsView。

 

7-1eShopOnContainers手机应用程序公开的用户设置

数据绑定可用于检索和设置Settings类公开的设置。 这是通过对视图绑定的控件实现的,该视图绑定到查看模型属性,反过来访问“设置”类中的属性,并且如果设置值已更改则提高属性已更改的通知。 有关eShopOnContainers移动应用程序如何构建视图模型并将其与视图关联的信息,请参阅

以下代码示例显示了来自SettingsView的Entry控件,允许用户输入集装式微服务的基本端点URL:

点击(此处)折叠或打开

  1. <Entry Text="{Binding Endpoint, Mode=TwoWay}" />


Entry控件使用双向绑定绑定到SettingsViewModel类的Endpoint属性。 以下代码示例显示了Endpoint属性:


点击(此处)折叠或打开

  1. public string Endpoint
  2. {
  3.     get { return _endpoint; }
  4.     set
  5.     {
  6.         _endpoint = value;

  7.         if(!string.IsNullOrEmpty(_endpoint))
  8.         {
  9.             UpdateEndpoint(_endpoint);
  10.         }

  11.         RaisePropertyChanged(() => Endpoint);
  12.     }
  13. }


Endpoint属性被设置时,调用UpdateEndpoint方法,前提是提供的值是有效的,并且引发了属性更改的通知。 以下代码示例显示UpdateEndpoint方法:


点击(此处)折叠或打开

  1. private void UpdateEndpoint(string endpoint)
  2. {
  3.     Settings.UrlBase = endpoint;
  4. }


此方法使用用户输入的基本端点URL值更新Settings类中的UrlBase属性,从而使其保持平台特定的存储。

SettingsView导航到,SettingsViewModel类中的InitializeAsync方法被执行。 以下代码示例显示了此方法:


点击(此处)折叠或打开

  1. public override Task InitializeAsync(object navigationData)
  2. {
  3.     ...
  4.     Endpoint = Settings.UrlBase;
  5.     ...
  6. }


该方法将Endpoint属性设置为Settings类中UrlBase属性的值。 访问UrlBase属性会导致Xam.Plugins.Settings库从平台特定的存储中检索设置值。 有关如何调用InitializeAsync方法的信息,请参阅在

该机制确保每当用户导航到SettingsView时,将从平台特定的存储中检索用户设置,并通过数据绑定进行呈现。 然后,如果用户更改设置值,数据绑定将确保它们立即保留回平台特定的存储。

概要

设置允许将配置应用程序行为的数据与代码分离,允许在不重新构建应用程序的情况下更改行为。 应用程序设置是应用程序创建和管理的数据,用户设置是影响应用程序行为的应用程序的可自定义设置,不需要频繁重新调整。

Xam.Plugins.Settings库提供一致的,类型安全的跨平台方法,用于持久化和检索应用程序和用户设置,数据绑定可用于访问使用库创建的设置。

阅读(5379) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~