Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

Xamarin.Forms でアプリの設定情報を保存するには (Properties Dictionary 使用)

こんにちは。エクセルソフトの田淵です。

アプリの設定情報は皆さん色んな方法で格納していると思いますが、Xamarin.Forms には標準で Properties Dictionary という Dictionary が用意されていて、そこにデータをぶっこめば適宜保存してくれます。

2015/7/6 時点の最新版、Xamarin.Forms 1.4.3.6374 で確認しています。

Xamarin.iOS, Xamarin.Android それぞれで設定情報を保存する場合は、Xamarin.iOS/Androidでアプリの設定情報を保存するには? - Build Insider をご覧ください。

Json.NET を使用して設定情報を保存する場合はこちら

サンプル

GitHub

画面写真

f:id:ytabuchi:20150706181103p:plain:w150 f:id:ytabuchi:20150706181107p:plain:w150

f:id:ytabuchi:20150706181116p:plain:w150 f:id:ytabuchi:20150706181058p:plain:w150

f:id:ytabuchi:20150706181112p:plain:w150 f:id:ytabuchi:20150706181114p:plain:w150

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 経由で参照する

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 でも同じです。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 の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。

以上です。

エクセルソフト | ダウンロード | 学習用リソース | JXUG リンクページ | ブログ購読