web-dev-qa-db-ja.com

現在のアクティビティを取得する-Xamarin Android

Android and iOS。現在の機能はスクリーンショットを取得し、コードでその画像を使用しています。そのため、ポータブルライブラリにインターフェイスがあります。

public interface IFileSystemService
{
    string GetAppDataFolder();
}

次のコードを使用して、ポータブルライブラリでもスクリーンショットを撮影しています。

static public bool TakeScreenshot()
    {
        try
        {
            byte[] ScreenshotBytes = DependencyService.Get<Interface.IScreenshotManager>().TakeScreenshot();
            return true;
        }
        catch (Exception ex)
        {
        }
        return false;
    }

これは、AndroidまたはiOSバージョンを呼び出します。

アンドロイド:

class ScreenshotManagerAndroid : IScreenshotManager
{
    public static Activity Activity { get; set; }

    public byte[] TakeScreenshot()
    {

        if (Activity == null)
        {
            throw new Exception("You have to set ScreenshotManager.Activity in your Android project");
        }

        var view = Activity.Window.DecorView;
        view.DrawingCacheEnabled = true;

        Bitmap bitmap = view.GetDrawingCache(true);

        byte[] bitmapData;

        using (var stream = new MemoryStream())
        {
            bitmap.Compress(Bitmap.CompressFormat.Png, 0, stream);
            bitmapData = stream.ToArray();
        }

        return bitmapData;
    }

ここでの質問は、アプリから現在のアクティビティを取得することです。

14
Lexu

Xamarin 2.5のリリース以降、Xamarin.Forms.Forms.Contextは 廃止 です。コンテキストは次のように取得できるようになりました。

var currentContext = Android.App.Application.Context;
11
Hagbard

より良い方法は、 Current Activity Plugin を使用することです。次に、_CrossCurrentActivity.Current.Activity_を実行します。

プラグインを使用したくなく、アプリにActivityが1つしかない場合は、MainActivityに静的変数を割り当てて、このように必要な場所を参照することで回避できます。 :

_public class MainActivity : FormsApplicationActivity {
    public static Context Context;

    public MainActivity () {
        Context = this;
    }
}
_

カスタムレンダラー内でContextが必要な場合は、次のように、コンストラクターに渡されるContextを使用します。

_public class MyEntryRenderer : EntryRenderer {

    private readonly Context _context;

    public MyEntryRenderer(Context context) : base(context) {
        _context = context;
    }

    // Now use _context or ((Activity)_context) any where you need to (just make sure you pass it into the base constructor)
}
_

古い非推奨の方法はvar view = ((Activity)Xamarin.Forms.Forms.Context).Window.DecorView;です

XamarinはActivityを_Forms.Context_に自動的に割り当てます。

27
hvaughan3
var activity = (Activity)Forms.Context;

またはMainActivityを使用している場合

var activity = (MainActivity)Forms.Context;
14
Will Faulkner