How to display dialog fragment in Android with LoadApplication from Xamarin.Forms
I am still fairly new to .NET MAUI and I need to rewrite a Xamarin.Forms android app to .NET MAUI. I am also using Prism framework since it has been used in Xamarin.Forms.
I have a Dialog fragment and I want to display it and initialize it when the main activity is created. In Xamarin.Forms you did this using LoadApplication(new App(new AndroidInitializer(this)));
in MainActivity.cs, but I don't know what to use in .NET MAUI. I looked through the lifecycle of .NET MAUI and also this post https://learn.microsoft.com/en-us/answers/questions/1048957/platform-specific-initialization-versus-net-maui-a, but I can't find out what I should use and also don't understand it properly. AndroidInitializer is used to invoke the AndroidNotificationService where the dialog fragment resides.
As I went throuh the documentation I saw that I don't use the MainActivity.cs for inicialization and I should use dependency injection in MauiProgram.cs. I tried it but I am not sure why it isn't working and how to make it work. Everywhere I look they all have a Interface. I don't have it and just want to call this Dialog Fragment when the MainPage is created (in my case it is SignInPage)
This is the AndroidInitializer:
public class AndroidInitializer {
public MainActivity MainActivity { get; }
public AndroidInitializer() {
}
public AndroidInitializer(MainActivity mainActivity) {
MainActivity = mainActivity;
}
//using prism I connect the AndroidNotificationService to INotificationService so I can call the Notification (dialog fragment)
public void RegisterTypes(IContainerRegistry containerRegistry) {
containerRegistry.RegisterInstance(typeof(INotificationService), new AndroidNotificationService(Android.App.Application.Context, MainActivity));
}
}
This is MauiProgram.cs
public static class MauiProgram {
public static MauiApp CreateMauiApp() {
var builder = MauiApp.CreateBuilder();
builder
.UsePrismApp<App>(PrismStartup.Configure)
.UseBarcodeReader()
.UseSkiaSharp()
.ConfigureFonts(fonts => {
fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
fonts.AddFont("Font Awesome 6 Brands-Regular-400", "Font Awesome 6 Brands-Regular-400");
fonts.AddFont("Font Awesome 6 Free-Regular-400", "Font Awesome 6 Free-Regular-400");
fonts.AddFont("Font Awesome 6 Free-Solid-400", "Font Awesome 6 Free-Solid-400");
});
#if ANDROID
builder.Services.AddTransient<AndroidInitializer>();
#endif
return builder.Build();
}
}
This is PrismStartup.cs for starting the app as a prism app
internal static class PrismStartup {
public static void Configure(PrismAppBuilder builder) {
builder.RegisterTypes(RegisterTypes)
.OnAppStart("NavigationPage/SignInPage");
}
private static void RegisterTypes(IContainerRegistry containerRegistry) {
containerRegistry.RegisterForNavigation<SignInPage>()
.RegisterInstance(SemanticScreenReader.Default);
#if ANDROID
containerRegistry.Register<AndroidInitializer>();
#endif
}
}
This is the MainActivity.cs from Xamarin.Forms.
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
LoadApplication(new App(new AndroidInitializer(this)));
}
}