SIN@SAPPOROWORKSの覚書

C#を中心に、夜な夜な試行錯誤したコードの記録です。

Xamarin.Forms 画面のサイズを取得する

【 Xamarin 記事一覧 】

コンストラクタでは、サイズが取得できない

次のようなコードを書くと、もれなくサイズの取得に失敗します。
単純にContentPageのサイズ(WidthとHeight)を表示しているだけですが、綺麗に-1になってしまっています。

using Xamarin.Forms;
namespace App1{
    public class App : Application{

        public App(){
            MainPage = new MyPage();
        }
        protected override void OnStart(){}
        protected override void OnSleep(){}
        protected override void OnResume(){}
    }

    class MyPage : ContentPage {

        public MyPage() {
            Content = new Label{ //ラベル1つ配置する
                HorizontalOptions = LayoutOptions.Center,//左右中央に配置
                VerticalOptions = LayoutOptions.Center,//上下中央に配置
                Text = string.Format("Width={0} Height={1}", Width, Height) //ContentPage.Width,ContentPage.Heightプロパティを表示する
            };
        }
    }
}

Android iOS WindowsPhone
f:id:furuya02:20150425053553p:plain:w200 f:id:furuya02:20150425053550p:plain:w200 f:id:furuya02:20150425053552p:plain:w200
-1 * -1 -1 * -1 -1 * -1

OnSizeAllocated

解決方法の1つとして、ContentPageのサイズが取得できてから、使用するという方法があります。
Width,Heightプロパティの値が変化した時点で、OnSizeAllocatedメソッドが呼ばれるので、これをオーバライドする方法です。
まー、この例の場合は、プロパティ値をバインディングした方が手っ取り早いですが・・・

using Xamarin.Forms;
namespace App1{
    public class App : Application{

        public App(){
            MainPage = new MyPage();
        }
        protected override void OnStart(){}
        protected override void OnSleep(){}
        protected override void OnResume(){}
    }

    class MyPage : ContentPage {

        private Label _label = new Label() { //クラス変数とする
            HorizontalOptions = LayoutOptions.Center,//左右中央に配置
            VerticalOptions = LayoutOptions.Center,//上下中央に配置
        };

        public MyPage() {
            Content = _label; //ラベル1つ配置する
        }

        protected override void OnSizeAllocated(double width, double height) {
            base.OnSizeAllocated(width, height);

            label.Text = string.Format("Width={0} Height={1}", Width, Height);//ContentPage.Width,ContentPage.Heightプロパティを表示する
        }
    }
}

下のように、サイズが表示されているのが確認できます。

Android iOS WindowsPhone
f:id:furuya02:20150425053811p:plain:w200 f:id:furuya02:20150425053812p:plain:w200 f:id:furuya02:20150425053814p:plain:w200
320 * 496 320 * 568 480 * 768


コンストラクタの前にサイズを確保する

どうしても、コンストラクタの時点でサイズが欲しい場合・・・
それは、もうAppクラスがインスタンス化される前に、確保するしかありません。

思い切って、Appクラスのコンストラクタを引数ありにして、ディスプレイのサイズを取得するように変更します。

※ここで、ターゲットがContentPageのサイズでなく、ディスプレイのサイズになっていることをご了承下さい。
ContentPageが画面いっぱいに構成されているアプリという前提です。

using Xamarin.Forms;
namespace App1{
    public class App : Application{
        public int ScreenWidth { get; private set; } //スクリーンサイズ(幅)
        public int ScreenHeight { get; private set; }//スクリーンサイズ(高さ)

        public App(int w,int h){
            // パラメータで初期化
            ScreenHeight = h;
            ScreenWidth = w;

            MainPage = new MyPage();
        }
        protected override void OnStart(){}
        protected override void OnSleep(){}
        protected override void OnResume(){}
    }

    class MyPage : ContentPage {

        public MyPage() {
            
            Content = new Label{
                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.Center,
                Text = string.Format("Width={0} Height={1}", ((App)Application.Current).ScreenWidth,((App)Application.Current).ScreenHeight)
            };
        }
    }
}

コンストラクタが引数ありになったので、当然、このままではコンパイルできません。
各プラットフォームで、コンストラクタを生成している部分をいじります。

Android

Androidでは、MainActivity.csを修正します。
Resources.DisplayMetrics.WidthPixels(HeightPixels)でデバイスの実サイズ(dip)を取得し、これをResources.DisplayMetrics.Densityでピクセルに変換しています。

画面サイズを取得して、これをコンストラクタの引数とします。

using Android.App;
using Android.Content.PM;
using Android.OS;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;

namespace App1.Droid{
    [Activity(Label = "App1", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : FormsApplicationActivity{
        protected override void OnCreate(Bundle bundle){
            base.OnCreate(bundle);

            Forms.Init(this, bundle);
            //スクリーンのサイズを取得する
            var w = (int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density);
            var h = (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density);

            
            LoadApplication(new App(w,h));//スクリーンサイズをパラメータにしてAppクラスを生成する
            //LoadApplication(new App());//引数なしはエラーとなる
        }
    }
}

iOS

iOSでは、AppDelegate.csを修正します。
UIScreen.MainScreen.Bounds.Width(Height)で画面サイズを取得して、これをコンストラクタの引数とします。

using Foundation;
using UIKit;

namespace App1.iOS{

    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate{
        public override bool FinishedLaunching(UIApplication app, NSDictionary options){
            global::Xamarin.Forms.Forms.Init();

            //スクリーンのサイズを取得する
            var w = (int)UIScreen.MainScreen.Bounds.Width;
            var h = (int)UIScreen.MainScreen.Bounds.Height;

            LoadApplication(new App(w,h));//スクリーンサイズをパラメータにしてAppクラスを生成する
            //LoadApplication(new App()); //引数なしはエラーとなる
            return base.FinishedLaunching(app, options);
        }
    }
}

WindowsPhone

WindowsPhoneでは、MainPage.xaml.csを修正します。
Application.Current.Host.Content.ActualWidth(ActualHeight)で画面サイズを取得して、これをコンストラクタの引数とします。


using Microsoft.Phone.Controls;
using Xamarin.Forms;
using Xamarin.Forms.Platform.WinPhone;
using Application = System.Windows.Application;

namespace App1.WinPhone{
    public partial class MainPage : FormsApplicationPage{
        public MainPage(){
            InitializeComponent();
            SupportedOrientations = SupportedPageOrientation.PortraitOrLandscape;
            Forms.Init();
            
            //スクリーンのサイズを取得する
            var w = (int)Application.Current.Host.Content.ActualWidth;
            var h = (int)Application.Current.Host.Content.ActualHeight; 
            LoadApplication(new App1.App(w,h));//スクリーンサイズをパラメータにしてAppクラスを生成する
            //LoadApplication(new App1.App());//引数なしはエラーとなる
        }
    }
}


下のように、サイズが表示されているのが確認できます。
ただし、AndroidとWindowsPhoneでは、高さが微妙に違うので注意が必要です。
対象としている領域が違うのが原因です。

Android iOS WindowsPhone
f:id:furuya02:20150425054040p:plain:w200 f:id:furuya02:20150425053812p:plain:w200 f:id:furuya02:20150425054041p:plain:w200
320 * 521 320 * 568 480 * 800



【 Xamarin 記事一覧 】

Xamarin.Forms MasterBehaviorについて

【 Xamarin 記事一覧 】

MasterBehavior

MasterBehaviorとは、Xamarin.Forms 1.3で、MasterDetailPageに新しく追加されたプロパティです。

f:id:furuya02:20150422012224p:plain

このプロパティは、列挙型になっており、Masterページ(通常メニュー的に左側に表示されるビュー)の隠れ具合を制御しています。
f:id:furuya02:20150422012250p:plain

  • Split  常時表示
  • f:id:furuya02:20150422012255p:plain
  • Popover 隠れる
  • f:id:furuya02:20150422012300p:plain
  • SplitOnPortrait 縦の時、常時表示
  • f:id:furuya02:20150422012304p:plain
  • SplitOnLandscape 横の時、常時表示
  • f:id:furuya02:20150422012308p:plain
  • Default(SplitOnLandscapeと同じ)
  • f:id:furuya02:20150422012312p:plain

なお、このオプションは、iPadなど大きなディスプレイの端末の時だけ機能し、iPhoneの場合は、常に隠れる動作(MasterBehavior.Popoverと同等)となります。
また、Ver1.3では、ちょっとバグがあるような記載があったのVer1.4で動作確認しました。

PM> Get-Package
Id                             Version              Description/Release Notes                                
--                             -------              -------------------------                                
WPtoolkit                      4.2013.08.16         Windows Phone toolkit provides ...
Xamarin.Android.Support.v4     19.0.2               C# bindings for android support library v4.
Xamarin.Forms                  1.4.2.6355           Build native UIs for iOS, Android, and Windows Phone ..

動作

Popover

メニューが隠れる動作は、つぎのような感じです。
f:id:furuya02:20150422012318g:plain

Slpit

メニューが常時表示する動作は、つぎのような感じです。
f:id:furuya02:20150422012336g:plain

コード

使用したコードを参考までに

using System;
using System.Linq;
using Xamarin.Forms;

namespace App1{
    public class App : Application{
        public App(){
            MainPage = new MyPage();
        }

        protected override void OnStart(){}

        protected override void OnSleep(){}

        protected override void OnResume(){}
    }

    class MyPage : MasterDetailPage{
        public MyPage() {

            MasterBehavior = MasterBehavior.Split;
            
            var ar = Enumerable.Range(0, 20).Select(n => "Items-" + n).ToList();
            var listView = new ListView {
                ItemsSource = ar,
                BackgroundColor = Color.Transparent,
            };
            listView.ItemSelected += (s, a) => SetDetailPage(a.SelectedItem.ToString());

            Master = new ContentPage{
                BackgroundColor = Color.Teal,
                Title = "TEST",//Maserページでは、Titleが設定されていないと動作できない
                Padding = new Thickness(0, Device.OnPlatform(20, 0, 0), 0, 0),
                Content = listView,
            };
            SetDetailPage(ar[0]);
        }

        void SetDetailPage(string title) {
            Detail = new NavigationPage(new DetailPage(title)){
                BarBackgroundColor = Color.Silver,//上部の背景色
            };
            try{ //MasterBehavior.Split等でIsPresentedをfalseにしようとすると例外となる
                IsPresented = false;
            }catch (Exception ex) {
                DisplayAlert("Exception",ex.Message, "OK");
            }
        }
    }

    class DetailPage : ContentPage{
        public DetailPage(string title){
            Content = new Label{
                Text = title,
                HorizontalOptions = LayoutOptions.Center,
                VerticalOptions = LayoutOptions.Center
            };
        }
    }
}

【 Xamarin 記事一覧 】

Xamarin.Forms Ver1.3以降の機能について

【 Xamarin 記事一覧 】

Ver1.3以降の機能を利用したサンプルアプリ

先日、「第4回 JXUG Conference with dotNetConf 2015 Japan」でお話させて頂いた時の資料です。

昨年末アップデートされた Xamarin 1.3と最近の1.4で利用可能になった新機能を利用して、Twitterクライアント風のアプリを作成してみたので、その説明です。

f:id:furuya02:20150419045039j:plain

以下は、サンプルアプリで使用してみた新機能です。

App Lifecycle OnStart,OnSleep,OnResume (1.3)
 Properties Dictionary (1.3)
Styles (1.3)
Behaviors (1.3)
Triggers (1.3)
Font (1.3)
ListView context actions (1.3)
 pull to refresh (1.4)
 headers and footers (1.4)
 row separator (1.4)
 Scroll (1.3)

ちなみに、使用している翻訳機能「Microsoft Translator 」は、WebAPIですが、言語のFromとToを指定するパラメータがあって、Toだけ指定すると、英語に限らずうまく扱ってくれるようです。

f:id:furuya02:20150419045435p:plain:w200f:id:furuya02:20150419045437p:plain:w200f:id:furuya02:20150419045434p:plain:w200

↓サンプルコードはこちらです。github.com


関係ありませんが・・・

知る人ぞ知る「日米商事」ちょっと寄ってきました。
全てのジャンルが揃うわけではありませんが、ここで見つけたら、個別売りでは恐らく最安値では無いでしょうか。
(微妙に、系列の違うものが多数あるので、分かってる人にお勧め)
f:id:furuya02:20150419051235j:plainf:id:furuya02:20150419051237j:plainf:id:furuya02:20150419051239j:plainf:id:furuya02:20150419051240j:plainf:id:furuya02:20150419051241j:plainf:id:furuya02:20150419051243j:plainf:id:furuya02:20150419051244j:plain

↓これは、別のお店ですが・・・・思わず買いそうになったアヒル隊長
f:id:furuya02:20150419051824j:plain


【 Xamarin 記事一覧 】

Xamarin.FormsでWebビューを使用するには?

【 Xamarin 記事一覧 】

BuildInsiderで連載されている「Xamarin逆引きTips」に寄稿させて頂きました。

Xamarin.FormsでWebビューを使用するには? - Build Insider

使用したコードは、下記にあります。

furuya02/XamarinTips.WebViewSample · GitHub




【 Xamarin 記事一覧 】

Xamarin.Forms 「ARC Welder」を使用してChromeブラウザで動作させて見た

【 Xamarin 記事一覧 】


ARC Welder

 昨日(2015年4月3日)、GoogleからAndroidアプリをChromeで動作させるというニュースがありました。
 ARCとは「Android Runtime for Chrome」の頭文字であり、Androidが使うAPIをラップして、ChromeブラウザまたはChrome OSで動かすランタイムとの事。まだ、ベータ版という事ですが・・・Xamarin.Formsで作成したAPKがうまく動作するかどうか試してました。
http://japanese.engadget.com/2015/04/02/google-android-chrome-arc-welder-apk/
f:id:furuya02:20150405104214p:plain

Xamarin.Formsのプロジェクト

結論から言ってしまうと、アプリのアイコンを設定して、リリースビルドすれば、証明書のあるパッケージは、問題なく動作するようです。

アイコン設定

プロジェクトテンプレートのデフォルトでは、アイコンが無いため、「ARC Welder」で「Launch App」時にエラーが発生してしまいます。
f:id:furuya02:20150405104224p:plain
ERROR: Required badging "icon" not found in package.

デバッグビルド

Xamarinのデバッグビルドは、高速化のため、「共有ランタイム(Shared Runtime)」などがリンクされていないのが原因だと思います。

証明書

証明書が無いパッケージでは、「Launch App」まで行けますが、実行時にcrashします。
f:id:furuya02:20150405104250p:plain

作業手順

それでは、実際に行った手順を順に紹介してみたいと思います。
(1)プロジェクトは、「Blank App (Xamarin.Forms Portable)」テンプレートを使用します。
f:id:furuya02:20150405104259p:plain
(2)構成マネージャで「Release」に変更します。
f:id:furuya02:20150405104304p:plain
(3)Androidプロジェクトのプロパティで、アイコンを設定します。
f:id:furuya02:20150405104309p:plain
(4)「ARC Welder」をインストールします。
https://chrome.google.com/webstore/detail/arc-welder/emfinbmielocnlhgmfkkmkngdoccbadn
f:id:furuya02:20150405104314p:plain
(5)インストールが完了すると、「chrome://extensions」で利用可能になります。
f:id:furuya02:20150405104320p:plain
(6)初回起動時に、作業ディレクトリの指定があるので、適当なフォルダを指定します。
f:id:furuya02:20150405104325p:plain:w200
(7)「Add your APK」で、Releaseビルドの証明書がある方を選択します。(App1/App1.Droid/bin/Release/App1.Droid-Signed.apk)
f:id:furuya02:20150405104332p:plain
(8)Orientationで「Portrait」、Form Factorで「Phone」を選択して「Launch App」を押します。
f:id:furuya02:20150405104339p:plain
(9)起動が確認できます。
f:id:furuya02:20150405104346p:plain
(10)「Launch App」で成功したアプリは、「拡張機能」の一覧に入り、次からは、ここから起動できます。
f:id:furuya02:20150405104351p:plain


Xamarin.Forms.Maps

試しに、Xamarin.Forms.Mapsを起動してみましたが、「Play開発者サービスの入手」をクリックするとクラッシュしましたw
f:id:furuya02:20150405104958p:plain:w200

【 Xamarin 記事一覧 】

Xamarin.Forms ライフサイクル

【 Xamarin 記事一覧 】

ライフサイクル

Xamarin.Forms 1.3において新しく刷新した、Xamarin.Forms.Applicationクラスには、次の3つのメソッドがオーバーライド可能になりました。

OnStart アプリのスタート時
OnSleep アプリがバックグランド(スリープ状態)に移行した時
OnResume アプリがバックグランド(スリープ状態)から復帰した時

この動作について、詳細なレポートが@matatabi_uxさんの所で紹介されています。

Xamarin.Forms の App Lifecycle の呼び出され方を調べたい - しっぽを追いかけて
Xamarin.Forms の App Lifecycle の呼び出され方を調べたい 【Windows Phone 8.0 編】 - しっぽを追いかけて
Xamarin.Forms の App Lifecycle の呼び出され方を調べたい 【iOS編】 - しっぽを追いかけて
Xamarin.Forms の App Lifecycle の呼び出され方を調べたい 【Android 編】 - しっぽを追いかけて

上記のページで、全然、完璧なのですが、もともとiOSやAndroidのライフサイクルについて知識の乏しい私が理解するにはちょっと重たかったので・・・
完全真似っこですが、私なりに確かめてみました。

動作確認用のコード

動作確認のために書いたコードは下記の通りです。
ナビゲーションページをルートとして1ページ目をライム色、2ページ目をピンク色にしました。
また、1ページ目には、2ページ目に移動するボタンと、ブラウザを開くボタンを配置しました。

通過したメソッドを確認するためには、Appクラスに、呼び出し元のクラス名及びメソッド名を出力するLog()を作成し、オーバライドした各メソッドからこれを呼び出すようにしました。

//App.cs
namespace App1{
    public class App : Application{
        public App(){
            //NavigationPageの上に最初のページを構築する
            MainPage = new NavigationPage(new TopPage());
        }

        protected override void OnStart(){
            Log();//ログ出力
        }

        protected override void OnSleep(){
            Log();//ログ出力
        }

        protected override void OnResume(){
            Log();//ログ出力
        }

        //呼び出し元のメソッド名を出力のする 「クラス名.メソッド名()」の形式
        public static void Log([CallerFilePath] string file = "", [CallerMemberName] string member = ""){
            Debug.WriteLine(string.Format("{0}.{1}()", Path.GetFileNameWithoutExtension(file).Split('\\').LastOrDefault(), member));
        }

    }

}

//最初のぺージ TopPage.cs
namespace App1{
    class TopPage : ContentPage{
        public TopPage(){
            BackgroundColor = Color.Lime;//背景色(ライム)

            //次ぼページ(SecondPage)を開くボタン
            var button1 = new Button{
                Text = "Next",
                Command = new Command(async () =>{
                    await Navigation.PushAsync(new SecondPage());
                })

            };
            //ブラウザを開くボタン
            var button2 = new Button{
                Text = "Browser",
                Command = new Command(() =>{
                    Device.OpenUri(new Uri("http://xamarin.com/"));
                })

            };
            //2つのボタンを上下に配置する
            Content = new StackLayout{
                Children = { button1, button2 }
            };
        }

        protected override void OnAppearing(){
            App.Log();//ログ出力
            base.OnAppearing();
        }
    }
}

//2つ目のページ SecondPage.cs
namespace App1{
    class SecondPage : ContentPage{
        public SecondPage(){
            BackgroundColor = Color.Pink;//背景色(ピンク)
        }
        protected override void OnAppearing(){
            App.Log();//ログ出力
            base.OnAppearing();
        }
    }
}



Androidでの実行画面
f:id:furuya02:20150403000800p:plain:w400
iOSでの実行画面
f:id:furuya02:20150403000757p:plain:w400
WindowsPhoneでの実行画面
f:id:furuya02:20150403000759p:plain:w400


iOSによる動作確認

AppDelegate.csでも、各メソッドをオーバーライドしてLog()をコールしました。

namespace App1.iOS{
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate{
        public override bool FinishedLaunching(UIApplication app, NSDictionary options){
            global::Xamarin.Forms.Forms.Init();
            LoadApplication(new App());

            App.Log();//ログ出力

            return base.FinishedLaunching(app, options);
        }

        public override void FinishedLaunching(UIApplication application) {
            App.Log();//ログ出力
            base.FinishedLaunching(application);
        }

        ・・・省略・・・

アプリ起動

f:id:furuya02:20150403001442p:plain:w150:leftAppDelegate.WillFinishLaunching() //起動時に呼び出される
AppDelegate.FinishedLaunching() //はじめての起動時に呼び出される
App.OnStart()
AppDelegate.OnActivated() // アクティブ化
TopPage.OnAppearing() // 表示

ページ遷移

f:id:furuya02:20150403001623p:plain:w200:leftSecondPage.OnAppearing()// 表示

ページ復帰

f:id:furuya02:20150403001826p:plain:w200:leftTopPage.OnAppearing()// 表示

ブラウザ起動

f:id:furuya02:20150403001846p:plain:w200:leftAppDelegate.OnResignActivation() //アプリが非Activeになる直前に呼び出される
App.OnSleep()
AppDelegate.DidEnterBackground() //アプリが非Activeになりバックグランド実行になった際に呼び出される

ホーム

f:id:furuya02:20150403001911p:plain:w200:leftAppDelegate.OnResignActivation() //アプリが非Activeになる直前に呼び出される
App.OnSleep()
AppDelegate.DidEnterBackground() //アプリが非Activeになりバックグランド実行になった際に呼び出される

タスクリストからの起動

f:id:furuya02:20150403011536p:plain:w200:leftAppDelegate.WillEnterForeground()
App.OnResume()
AppDelegate.OnActivated()

タスクリストへの移行

f:id:furuya02:20150403001932p:plain:w200:leftAppDelegate.OnResignActivation() //アプリが非Activeになる直前に呼び出される
App.OnSleep()

アプリ終了

f:id:furuya02:20150403001954p:plain:w150:leftAppDelegate.DidEnterBackground() //アプリが非Activeになりバックグランド実行になった際に呼び出される
AppDelegate.WillTerminate() //システムからのアプリ終了の際に呼び出される


Androidによる動作確認

MainActivity.csでも、各メソッドをオーバーライドしてLog()をコールしました。

namespace App1.Droid{
    [Activity(Label = "App1", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity{
        protected override void OnCreate(Bundle bundle){
            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());

            App.Log();//ログ出力
        }

        protected override void OnStart() {
            App.Log();//ログ出力
            base.OnStart();
        }

        protected override void OnRestoreInstanceState(Bundle savedInstanceState) {
            App.Log();//ログ出力
            base.OnRestoreInstanceState(savedInstanceState);
        }
        
        ・・・省略・・・

アプリ起動

f:id:furuya02:20150403002304p:plain:w100:leftApp.OnStart()
MainActivity.OnCreate()
MainActivity.OnStart()
MainActivity.OnPostCreate()
MainActivity.OnResume()
MainActivity.OnPostResume()
TopPage.OnAppearing()

ページ遷移

f:id:furuya02:20150403002419p:plain:w200:leftSecondPage.OnAppearing()

ページ復帰

f:id:furuya02:20150403002438p:plain:w200:leftTopPage.OnAppearing()

ブラウザ起動

f:id:furuya02:20150403002452p:plain:w200:leftMainActivity.OnUserLeaveHint()
MainActivity.OnPause()
MainActivity.OnSaveInstanceState()
MainActivity.OnStop()
App.OnSleep()

ブラウザからの復帰

f:id:furuya02:20150403002507p:plain:w200:leftMainActivity.OnRestart()
App.OnResume()
MainActivity.OnStart()
App.OnResume()
MainActivity.OnResume()
MainActivity.OnPostResume()

ホーム

f:id:furuya02:20150403002523p:plain:w200:leftMainActivity.OnUserLeaveHint()
MainActivity.OnPause()
MainActivity.OnSaveInstanceState()
MainActivity.OnStop()
App.OnSleep()

タスクリストからの起動

f:id:furuya02:20150403010949p:plain:w200:left
MainActivity.OnRestart()
App.OnResume()
MainActivity.OnStart()
App.OnResume()
MainActivity.OnResume()
MainActivity.OnPostResume()

タスクリストへの移行

f:id:furuya02:20150403002535p:plain:w200:left
ログなし(おそらくこの時点ではActive)


アプリ終了

f:id:furuya02:20150403002550p:plain:w100:left
ログなし(既にHomeに遷移した時点でOnStopとなっているから)



サンプル

github.com



【 Xamarin 記事一覧 】

Xamarin.FormsでListViewのコンテキストアクションを使用するには?

【 Xamarin 記事一覧 】

BuildInsiderで連載されている「Xamarin逆引きTips」に寄稿させて頂きました。

Xamarin.FormsでListViewのコンテキストアクションを使用するには? - Build Insider

使用したコードは、下記にあります。

furuya02/XamarinTips.ContextActionsSample · GitHub




【 Xamarin 記事一覧 】