The number one complaint I hear about Xamarin.Forms is the slow startup time of the applications that use it. The team at Xamarin has done a lot to help with this and give some more options such as XAML Compilation, Lazy Loading, and Ahead of Time Compilation. Check out some of David Ortinau’s suggestions here: 5 Ways to Boost Xamarin.Forms App Startup Time.
However, one of the best ways I’ve found to help with this issue is to use Xamarin.Forms Embedding to its full potential. Embedding became available in Xamarin.Forms 2.5 and at a high level allows you to embed your Xamarin.Forms pages into your Native Xamarin views by using the extension methods .CreateFragment(Context context); for Android and .CreateViewController(); for iOS. This is most commonly used for when you want to share some UI in your Xamarin Native apps using Xamarin.Forms, however you still need to call Xamarin.Forms.Init() which is one of the main culprits in the slow startup time.
The solution proposed here still allows you to create almost all of your views in Xamarin.Forms by using embedding, but requires some architecture and design changes. The premise is this:
- First Activity is non-Xamarin.Forms and loads your app right away
- Init Xamarin.Forms after this activity is loaded
- Embed Xamarin.Forms pages in other Activities
- Lift navigation out of Xamarin.Forms and into the native navigation.
This also has advantages outside the startup time such as better performance on transitions, more natural look and feel to end-users, performance gains in other areas, and a smaller app-size.
This means:
- No
NavigationPage - No Xamarin.Forms toolbar (using the native
Toolbarcontrol instead) - Still have MVVM and all our bindings we would expect
So if you’re already using a framework that is not tied down to Xamarin.Forms such as MvvmLight, you don’t have to change much behind the scenes since the INavigationService is abstracted.
Let’s kick this off by creating an inheritable Activity that handles the embedding and layout how we want.
xamarin_forms_activity.axml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
android:layout_gravity="top"
app:elevation="0dp">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?android:attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
</android.support.design.widget.AppBarLayout>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
This layout gives us the native Android toolbar (with the shadow! Another plus!) and a space for us to embed in this FrameLayout.
Now let’s create the Activity:
XamarinFormsActivity.cs
/// <summary>
/// Base xamarin forms activity.
/// This activity contains a single fragment in the layout and renders the fragment pulled from the Xamarin.Forms page
/// </summary>
public abstract class XamarinFormsActivity<TPage> : AppCompatActivity
where TPage : ContentPage, new()
{
protected readonly TPage _page;
protected int _containerLayoutId = Resource.Layout.activity_fragment_container;
public Android.Support.V7.Widget.Toolbar Toolbar { get; set; }
public AppBarLayout AppBar { get; set; }
public XamarinFormsActivity()
{
_page = new TPage();
}
/// <summary>
/// Creates the activity and maps the Xamarin.Forms page to the fragment
/// </summary>
/// <param name="savedInstanceState">Saved instance state.</param>
protected override void OnCreate(Android.OS.Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.xamarin_forms_activity);
Toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
if (Toolbar?.Parent != null)
{
AppBar = Toolbar?.Parent as AppBarLayout;
SetSupportActionBar(Toolbar);
}
// register the fragment
var transaction = SupportFragmentManager.BeginTransaction();
transaction.Add(Resource.Id.fragment_container, _page.CreateSupportFragment(this));
transaction.Commit();
SupportActionBar?.SetDisplayHomeAsUpEnabled(true);
SupportActionBar?.SetDisplayShowHomeEnabled(true);
Toolbar?.SetBackgroundColor(Android.Graphics.Color.White);
// everything else from this point should be managed by the Xamarin.Forms page behind the fragment
}
}
So now we can create a simple Xamarin.Forms page:
SomePage.xaml
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="MyApp.Pages.SomePage">
<ContentPage.Content>
<Grid>
<Label Text="I'm Embedded!" HorizontalOptions="Center" VerticalOptions="Center"/>
</Grid>
</ContentPage.Content>
</ContentPage>
Then create the associated Activity:
SomeActivity.cs
public class SomeActivity : XamarinFormsActivity<SomePage>
{
protected override void OnCreate(Bundle savedInstance)
{
SupportActionBar.Title = "Some Page";
}
}
Now all we have to do is kick off this SomeActivity after calling Xamarin.Forms.Init() and we are good to go! If we have a MainActivity we can call it before navigating if it isn’t initialized, or execute it in OnResume or a similar lifecycle event.
MainActivity.cs
public class MainActivity : AppCompatActivity
{
protected override void OnCreate(Bundle savedInstance)
{
base.OnCreate(savedInstance);
SetContentView(Resource.Layout.main_activity);
var someButton = FindViewBy<Button>(Resource.Id.some_button);
someButton.Click += delegate
{
if(!Xamarin.Forms.Forms.IsInitialized)
Xamarin.Forms.Forms.Init(this, savedInstance);
StartActivity(typeof(SomeActivity));
}
}
}
And there you have it! Some new Xamarin.Forms embedding for performance and other extra benefits 🙂
In future posts of this subject, we’ll look at the same setup for iOS, extending interactions between the Xamarin.Forms Page and the native Activity and ViewControllers, using advanced native components with the embedded Xamarin.Forms Page, and more!
Let me know what you think of this pattern – have you used it? What else would you want to hear about it??
Be sure to checkout some of the Xamarin examples on embedding too!

If you like what you see, don’t forget to follow me on twitter @Suave_Pirate, check out my GitHub, and subscribe to my blog to learn more mobile developer tips and tricks!
Interested in sponsoring developer content? Message @Suave_Pirate on twitter for details.










