読者です 読者をやめる 読者になる 読者になる

Xamarin 日本語情報

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

Xamarin.Forms の Device クラスについて(特に Device.OnPlatform)

Xamarin Xamarin.Forms

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

Device Class - Xamarin

にあるように、Xamarin.Forms にはプラットフォームやデバイスの種類に準じた処理ができるような Device クラスというのがあります。

Device.OnPlatform

この中でも、iOS で普通に ContentPage を表示すると一番上の Status bar に文字が被っちゃうのを避けるために必要な Device.OnPlatform はよく使うと思います。

  • C# の場合
Padding = new Thickness (0, Device.OnPlatform(20,0,0), 0, 0);
<ContentPage.Padding>
  <OnPlatform x:TypeArguments="Thickness"
              iOS="0, 20, 0, 0"
              Android="0"
              WinPhone="0" />
</ContentPage.Padding>

上記の Xamarin のページには

OnPlatform does not currently support differentiating the Windows 8.1, Windows Phone 8.1, and UWP/Windows 10 platforms.

とありますが Xamarin.Forms 2.0 になり、UWP もストアも WinPhone に含む形でサポートされたようです。

UWP
f:id:ytabuchi:20160130214113p:plain:w450

Windows Store
f:id:ytabuchi:20160130214948p:plain:w450

Windows Phone 8.1
f:id:ytabuchi:20160130215253p:plain:w300

Xamarin.Forms で Windows を含む各種プラットフォーム展開を検討されている方は Xamarin.Forms を最新版にしましょう。

その他の Device クラスも少し紹介

Device.BeginInvokeOnMainThread

重要なやつ。バックグラウンドのスレッドから UI スレッドを触ることは出来ないので、UI スレッドに戻す処理を Device.BeginInvokeOnMainThread で包みましょう。これは iOSInvokeOnMainThreadAndroidRunOnUiThreadWindowsDispatcher.BeginInvoke と同等です。

Device.BeginInvokeOnMainThread ( () => {
  // UI を操作する処理
});

Device.OS/Device.Idiom

Device.OS

を判別します。Xamarin のドキュメントの例そのままですが、以下のように OS によって個別に指定する場合に使用します。

if (Device.OS == TargetPlatform.iOS) {
    // いつもの iOS の Status bar を避けるやつ。
    stackLayout.Padding = new Thickness (0, 20, 0, 0);
}

Font font;

if (Device.OS == TargetPlatform.iOS) {
  font = Font.OfSize ("MarkerFelt-Thin", Device.GetNamedSize (NamedSize.Medium, typeof(Label)));
} else {
  font = Font.SystemFontOfSize (Device.GetNamedSize (NamedSize.Medium, typeof(Label)));
}

label.FontFamily = font.FontFamily;
label.FontAttributes = font.FontAttributes;
label.FontSize = font.FontSize;

Device.Idiom

  • Phone
  • Tablet
  • Desktop (UWP のみで取得できる模様)

を判別します。

Label.Text = $"Device type: {Device.OS}.{Device.Idiom}"; で以下が表示されます。

f:id:ytabuchi:20160130221201p:plain:w300

以下のように、スマホ以外でレイアウトを変えたりするのに使えそうです。

if (Device.Idiom == TargetIdiom.Phone) {
    // 縦用のレイアウト
} else {
    // 横用または大きな画面用のレイアウト
}

Device.Styles

以下のビルドインのスタイルが用意されています。

  • BodyStyle
  • CaptionStyle
  • ListItemDetailTextStyle
  • ListItemTextStyle
  • SubtitleStyle
  • TitleStyle

Style = Device.Styles.TitleStyle<Label Text="Style" Style="{DynamicResource TitleStyle}"/> で使用します。

Device.GetNamedSize

Large, Medium などのサイズが用意されています。使いどころが難しいですが Device.OnPlarform を一緒に使うとよいかも。ただ、Windows ストアだけ異様に文字が小さいのはどうやって回避すべきか分かってませんw

Device.OpenUri

これはそのままで URL を開きます。

Device.OpenUri(new Uri("http://xamarin.com"));

ブラウザで URL を開きます。が、Device.OpenUri で面白いのは URL なので、tel:090XXXXXXXXsms:090XXXXXXX?body=こんにちは+SMS!! などの Prefix が使えることかもしれません。

Device.StartTimer

タイマー機能もありますよ。と。

まとめ

各種デバイス、OS によって処理を分ける必要があるときに使う Device クラスを紹介しました。詳しくは Xamarin のサンプル を見ていただくのが早いです。

セミナー&勉強会のお知らせ

2016/2/5(金) の午後に初心者向けセミナー、夜に勉強会を開催します。ぜひお越しください♪

Xamarin 気になった方は

是非 ダウンロード(直接) / ダウンロード(弊社経由) して触ってみてください。 学習用リソースJXUG リンクページ に参考資料を纏めてますので併せてどうぞ。

Xamarin の情報が欲しい方はこのブログも購読いただいたりすると嬉しいです。

以上です。