VS2019 更新出现 FragmentManager 错误

问题描述

我最近将 VisualStudio 2019 的安装从 16.4.19 升级到 16.9.3 清理了一些错误后,它构建得很好。 当我尝试在 7.0 平板电脑上部署和运行它时,我收到以下消息:

java.lang.IllegalStateException Message=FragmentManager has not been attached to a host.

这是产生问题的代码

void Navigate(Android.Support.V4.App.Fragment fragment)
{
    var transaction = base.SupportFragmentManager.BeginTransaction();
    transaction.Replace(Resource.Id.contentFrame,fragment);
    transaction.Commit();
}

这段代码调用它:

void OnMenuItemSelected(object sender,Android.Support.Design.Widget.NavigationView.NavigationItemSelectedEventArgs e)
{
    Vars.OnMain = false;    //turn off screen updates until mainscreen is open
    switch (e.MenuItem.ItemId)
    {
        case Resource.Id.aboutMenuItem: Navigate(new AboutFragment()); break;
        case Resource.Id.catalogMenuItem: Navigate(new CatalogFragment()); break;
        //case Resource.Id.itemmenuItem: Navigate(new ItemFragment()); break;
        case Resource.Id.helpMenuItem: Navigate(new HelpFragment()); break;
        case Resource.Id.settingsMenuItem: Navigate(new SettingsFragment()); break;
        case Resource.Id.coordinateMenuItem: Navigate(new CoordinateFragment()); break;
        case Resource.Id.mainMenuItem: Navigate(new MainScreenFragment()); break;
        default: return;
    }

    e.MenuItem.SetChecked(true);

    //var drawerLayout = FindViewById<Android.Support.V4.Widget.DrawerLayout>(Resource.Id.drawerLayout);
    drawerLayout.CloseDrawer(Android.Support.V4.View.GravityCompat.End);
}

该应用已运行多年,太大,无法在此处发布。

去年 VS2019 环境有什么变化会导致这个问题吗?

感谢您的帮助, 丹

解决方法

从您发布的以下代码中,我们发现您正在从 base 变量获取片段管理器。 base 本身从哪里获得 FragmentManager?当您 Navigate 时,活动可能会被销毁并重新创建。因此,您可能需要获得一个新的 FragmentManager。

void Navigate(Android.Support.V4.App.Fragment fragment)
{
    var transaction = base.SupportFragmentManager.BeginTransaction();
    transaction.Replace(Resource.Id.contentFrame,fragment);
    transaction.Commit();
}

所以,您可以尝试使用以下代码:

FragmentTransaction transaction = FragmentManager.BeginTransaction ();
transaction.Replace(Resource.Id.contentFrame,fragment);
transaction.Commit();