2

ここで説明されている XLabs メソッドを使用して、(Android で) 画面が回転するタイミングを判断しようとしていますXamarin Forms で画面の回転/向きを処理する方法は? で、困っています。

MainActivityのOnConfigurationChangedメソッドをオーバーライドします

        public override void OnConfigurationChanged (Android.Content.Res.Configuration newConfig)
    {
        base.OnConfigurationChanged (newConfig);

        var xapp = Resolver.Resolve<IXFormsApp> ();
        if (xapp == null)
            return;

        switch (newConfig.Orientation) {
        case Android.Content.Res.Orientation.Landscape:
            xapp.Orientation = XLabs.Enums.Orientation.Landscape;
            break;
        case Android.Content.Res.Orientation.Portrait:
            //xapp.Orientation = XLabs.Enums.Orientation.Portrait;
            break;
        default:
            break;
        }
        }

IXFormsApp の Orientation 変数、つまり xapp.Orientation に問題があります。XLabs のドキュメントでは、コンパイラと同様に、これを「保護されたセット」としてリストしています。

MainActivity.cs(109,5,109,21): error CS0200: Property or indexer 'XLabs.Platform.Mvvm.IXFormsApp.Orientation' cannot be assigned to -- it is read only

そして、それは自動的に設定されません(使用されている場所を確認すると、常に「なし」に設定されています)。回転?

関連するメモとして、Rotation ハンドラーを設定しようとしても (理由はわかりませんが、やってみようと思いました)、異常な結果が得られました。

            xapp.Rotation += (sender, args) =>
        {
            switch (args.Value)
            {
            case XLabs.Enums.Orientation.Landscape:
                //xapp.Orientation = XLabs.Enums.Orientation.Landscape;
                ...
                break;
            case XLabs.Enums.Orientation.Portrait:
                ...
                break;
            default:
                break;
            }
            };

Android コードを試してみると、次のエラーが表示されます。

MainActivity.cs(60,4,60,22): error CS0019: Operator '+=' cannot be applied to operands of type 'System.EventHandler<XLabs.EventArgs<XLabs.Enums.Orientation>>' and 'lambda expression'

ただし、Forms コード (結果が使用される場所) で設定した場合は問題ありません (ハンドラーが実際に呼び出されることはないようですが)。なぜこれが当てはまるのか、誰にもわかりますか?

4

2 に答える 2

0

OnSizeAllocated メソッドのオーバーライドを使用して、向きの変化を検出できます。

double previousWidth;
double previousHeight;

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

        if (previousWidth != width || previousHeight != height)
        {
            previousWidth = width;
            previousHeight = height;

            if (width > height)
            {
                // landscape mode
            }
            else
            {
                // portrait mode
            }   
        }
    }
于 2015-09-20T19:15:23.913 に答える