こんにちは。エクセルソフトの田淵です。
本記事は Xamarin.Forms でアプリの設定情報を保存するには (Properties Dictionary 使用) - Xamarin 日本語情報 の転載記事です。
アプリの設定情報は皆さん色んな方法で格納していると思いますが、Xamarin.Forms には標準で Properties Dictionary
という Dictionary が用意されていて、そこにデータをぶっこめば適宜保存してくれます。
2015/7/6 時点の最新版、Xamarin.Forms 1.4.3.6374 で確認しています。
Xamarin.iOS, Xamarin.Android それぞれで設定情報を保存する場合は、Xamarin.iOS/Androidでアプリの設定情報を保存するには? - Build Insider をご覧ください。
サンプル
画面写真
Properties Dictionary を使う
Working with the App Lifecycle - Xamarin
にあるように、
保存:
Application.Current.Properties ["id"] = someClass.ID;
復元:
if (Application.Current.Properties.ContainsKey("id"))
{
var id = Application.Current.Properties ["id"] as int;
// do something with id
}
だけです。
しっかりやる場合には、id:matatabi_ux さんの
Xamarin.Forms でセッションデータを保存・復元したい - しっぽを追いかけて
をご参照ください(私には難しいです…)。なお、Windows Phone のセッションデータが保持できない。とありますが、現在の 1.4.3.6374 では修正されています。ブラボー!!
やり方
string Name, DateTime Birthday, bool Like の 3つのデータを保存したいと思います。
コントロールの値を直に参照する
例えば C# で (これは Xaml では作ってません。すみません。) ベタにやるとこんな感じです。
コントロール:
var entryName = new Entry { Placeholder = "Input your name", };
var pickerBirthday = new DatePicker { Date = new DateTime(1990, 1, 1) };
var switchLike = new Switch { };
var saveButton = new Button { Text = "Save" }
var loadButton = new Button { Text = "Load" }
var clearButton = new Button { Text = "Clear" }
保存:
var name = entryName.Text;
var birth = pickerBirthday.Date;
var like = switchLike.IsToggled;
Application.Current.Properties["name"] = name;
Application.Current.Properties["birth"] = birth;
Application.Current.Properties["like"] = like;
復元:
if (Application.Current.Properties.ContainsKey("name"))
{
var name = (string)Application.Current.Properties["name"];
var birth = (DateTime)Application.Current.Properties["birth"];
var like = (bool)Application.Current.Properties["like"];
entryName.Text = name;
pickerBirthday.Date = birth;
switchLike.IsToggled = like;
}
削除:
Application.Current.Properties.Clear();
かなり面倒ですね!保存したい値が多いと更に大変そうですw
ViewModel 経由で参照する ( C# )
INotifyPropertyChanged な ViewModel を用意します。
AllPagesViewModel vm = new AllPagesViewModel();
でインスタンス化しておいて、Binding を指定します。(インスタンス化しないといけないのか?は良く分かっていません… 詳しい方教えてください…)
var entryName = new Entry { Placeholder = "Input your name" };
entryName.SetBinding(Entry.TextProperty, "Name", mode: BindingMode.TwoWay);
var pickerBirthday = new DatePicker { };
pickerBirthday.SetBinding(DatePicker.DateProperty, "Birthday", mode: BindingMode.TwoWay);
var switchLike = new Switch { };
switchLike.SetBinding(Switch.IsToggledProperty, "Like", mode: BindingMode.TwoWay);
で、
保存:
Application.Current.Properties["name"] = vm.Name;
Application.Current.Properties["birth"] = vm.Birthday;
Application.Current.Properties["like"] = vm.Like;
復元:
if (Application.Current.Properties.ContainsKey("name"))
{
vm.Name = (string)Application.Current.Properties["name"];
vm.Birthday = (DateTime)Application.Current.Properties["birth"];
vm.Like = (bool)Application.Current.Properties["like"];
}
としてあげれば良いですね。削除は同じです。TwoWay なのでコントロールを手動で書き換える必要もなく、少しだけ楽になりました。
ViewModel 経由で参照する ( Xaml / xaml.cs )
Xaml でも同じです。Binding がさっくり書けるので Xaml の方が更に楽かもしれません。
Xaml:
<Entry Text="{Binding Name, Mode=TwoWay}" Placeholder="Input your name" />
<DatePicker Date="{Binding Birthday, Mode=TwoWay}" />
<Switch IsToggled="{Binding Like, Mode=TwoWay}" />
コードビハインドは C# と同じです。
まずは、Properties Dictionary を使用する方法をご紹介しました。こういう簡単なことが簡単にできるように用意されているのは嬉しいですね。次はひと手間かけて Json.NET で設定を Json に保存してみたいと思います。
Xamarin 気になった方は
是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。
学習用リソース や JXUG リンクページ に参考資料を纏めてますので併せてどうぞ。
Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。
以上です。