Xamarin.Forms は複数ページのアプリを作れますが、その実現方法は (Android の場合) 一つの Activity 上でビュー表示を切り替えるシングル Activity アプリです。つまり根っこに Activity がいるわけです。それならその Activity を他の Activity から起動したり逆に他の Activity を起動したりできるかもしれません。
ということで試してみました。
■ 素の Activity と Forms の Activity を作る
※リソースファイルなどは省略します。
素の Activity (起動 Activity) 例
まず素の Activity を作ります。今回は素のアクティビティを最初に表示される Activity としてみました。
[Activity(Label = "@string/app_name", MainLauncher = true, Theme = "@style/AppTheme.NoActionBar")]
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
var button = FindViewById<Button>(Resource.Id.button1);
button.Click += (sender, arg) =>
StartActivity(new Android.Content.Intent(this, typeof(FormsActivity)));
NativeNavigation.SetContext(this);
}
}
基本はボタンのタップで、Forms の Activity を起動するコードがあるだけです。
あと、Forms での画面遷移を雑に実装するために、Activity を取っておく処理が最後にあります。
Forms の Activity 例
Forms の Activity は何の変哲もないただの Xamarin.Forms の Activity です。
[Activity(Label = "FormsActivity", Theme = "@style/AppTheme.NoActionBar")]
public class FormsActivity : Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new Core.App());
}
}
Forms のページ 例
Xamarin.Forms のページです。DependencyService で Android の画面遷移を呼ぶようにしてみました。
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class FormsMainPage : ContentPage
{
public FormsMainPage()
{
InitializeComponent();
button2.Clicked += (sender, arg) =>
DependencyService.Get<INativeNavigation>().GoToNext();
}
}
DependencyService 例
public interface INativeNavigation
{
void GoToNext();
}
using Android.Content;
using Namespace;
[assembly: Xamarin.Forms.Dependency(typeof(NativeNavigation))]
namespace Namespace
{
class NativeNavigation : Core.INativeNavigation
{
static Context _context;
public static void SetContext(Context context) => _context = context;
static Context Context => _context;
public void GoToNext() =>
Context.StartActivity(new Intent(Context, typeof(MainActivity)));
}
}
■ 実行
ボタンのタップで 素の Activity → Forms の Activity → 素の Activity ... と遷移できました。
こんなことをして良いものなのか、この経験が生きる日がいずれ来るのか分かりませんが、もしかしたら Xamarin に限らず何かでこの経験に救われる日が来るかもしれません。
来ない気がしますけれど。