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 的待办事项列表移动应用程序。
问题是:
- 在android系统中,我可以创建快捷方式来打开特定列表
应用程序。
- 当我打开应用程序并按下主页按钮时,它仍然在后台
(没关系)
- 当我从桌面快捷方式 运行 应用程序时,它会打开
android activity 当我创建新的 PrismApplication (
LoadApplication(new App());
) 一切正常 运行ning OK,但是之后
为视图创建视图模型,应用程序仍在使用旧的视图模型
前。
我做了这个变通方法并且我使用了相同的 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}"
也能用了
我有 Xamarin.Android 使用 Prism 的待办事项列表移动应用程序。
问题是:
- 在android系统中,我可以创建快捷方式来打开特定列表 应用程序。
- 当我打开应用程序并按下主页按钮时,它仍然在后台 (没关系)
- 当我从桌面快捷方式 运行 应用程序时,它会打开
android activity 当我创建新的 PrismApplication (
LoadApplication(new App());
) 一切正常 运行ning OK,但是之后 为视图创建视图模型,应用程序仍在使用旧的视图模型 前。
我做了这个变通方法并且我使用了相同的 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}"
也能用了