Xamarin.Android 应用通过快捷方式恢复 - 在将 MasterDetailPage 添加到容器之前必须设置 Master 和 Detail

Xamarin.Android app resumed by shortcut intent - Master and Detail must be set before adding MasterDetailPage to a container

我有 Xamarin.Android 使用 Prism 的待办事项列表移动应用程序。

问题是:

我做了这个变通方法并且我使用了相同的 PrismApplication 实例:

static App xamApp;

protected override void OnCreate(Bundle bundle)
{
    if (xamApp == null)
    {
        Forms.Init(this, bundle);
        xamApp = new App();
    }

    LoadApplication(xamApp);
    xamApp.Redirect(Intent.GetStringExtra("ListID"));
}

现在,问题是重定向。此代码:

public void Redirect(string listId)
{
    NavigationService.NavigateAsync($"MainPage/MainNavigationPage/TodoList?id={listId}", animated: false);
}

导致错误:

System.InvalidOperationException: Master and Detail must be set before adding MasterDetailPage to a container.

Prism 应通过来自 NavigateAsync uri 的 "TodoList" 处理 MasterDetailPage 中的细节绑定。

有人知道这里的问题是什么吗?

根据您提供的信息,我假设当应用程序再次启动时,它已经 运行,您之前的 MasterDetail 页面已经在堆栈中。在您的重置方法中,您想将导航堆栈重置为传入参数的新 uri。在这种情况下,您应该使用绝对 uri。这意味着尝试向您的 uri 添加“/”前缀。所以像这样:

public void Redirect(string listId)
{
    NavigationService.NavigateAsync($"/MainPage/MainNavigationPage/TodoList?id={listId}", animated: false);
}

所以我终于让它工作了。

  • 首先我在 ActivityMainActivity

    的属性中使用了 LaunchMode = LaunchMode.SingleTask

    [Activity(Label = "..", LaunchMode = LaunchMode.SingleTask, Icon = "@drawable/icon", Theme = "@style/MainTheme", MainLauncher = true]

    public class 主要Activity : FormsAppCompatActivity

  • 然后我使用了 OnNewIntent FormsAppCompatActivity 的方法,所以在应用程序进入后台后,只有本次活动发起:

protected override void OnNewIntent(Intent intent)
{
    var listId = intent.GetStringExtra("ListID");
    ((App)App.Current).Redirect(listId);
}
  • 现在 $"MainNavigationPage/TodoList?id={listId}" 也能用了