【问题标题】:Xamarin, C#, when using AndroidX, how do you get your activity's default FragmentManager to use the AndroidX version not the old one?Xamarin,C#,在使用 AndroidX 时,如何让活动的默认 FragmentManager 使用 AndroidX 版本而不是旧版本?
【发布时间】:2021-11-26 18:07:20
【问题描述】:

我的 Xamarin Android 项目中有 AndroidX。在https://docs.microsoft.com/en-us/xamarin/android/platform/fragments/managing-fragments 中,文章说每个活动都有自己的 FragmentManager,您使用“this”。参考它。
但是,当我执行以下操作时:

var fragmentTransaction = this.FragmentManager.BeginTransaction();  // using Android.App. the deprecated version

我可以看到“这个”。引用过时的 - 你如何强制一个活动自动包含新的 AndroidX 版本?

【问题讨论】:

  • 您可以检查您的活动实现的类。如果它实现了 AppCompatActivity 并且 Target Android 版本高于 9,代码 'AndroidX.Fragment.App.FragmentManager fm = this.SupportFragmentManager' 将正常工作。因为代码 'this.SupportFragmentManager' 使用包 Android.Support。高版本V4.App,低版本如Android 9.0使用AndroidX.Fragment.App包。

标签: android xamarin.android androidx fragmentmanager


【解决方案1】:

不幸的是,即使是最新的 VS2022 预览版,在使用标准模板添加新项目时创建 Fragment 时仍默认使用已弃用的 Android.App.Fragment。所以你会立即得到错误的 Fragment。

正如 Fragment 应该从 AndroidX.Fragment.App 派生一样,FragmentManager 也应该派生,因此您需要 AndroidX.Fragment.App.FragmentManager

例如 AndroidX.Fragment.App.FragmentManager fm = this.SupportFragmentManager;

或者如果您需要使用静态方法,您可以将 Activity 作为参数传递给该方法并像下面这样使用它

AndroidX.Fragment.App.FragmentManager fm = activity.SupportFragmentManager;

基本上,您只需要正确使用 using 语句,确保您使用的是 AndroidX 版本,然后如果从片段或 Activity 获取 FragmentManager,请注意不同的语法。

您可能还需要考虑更改片段的处理以使用 NavigationComponent,这基本上消除了直接使用 FragmentManager 的需要。

【讨论】:

  • 声明,AndroidX.Fragment.App.FragmentManager fm = this.SupportFragmentManager;,给了我“不能隐式转换”和这个声明,AndroidX.Fragment.App.FragmentManager fm = activity.SupportFragmentManager;, “需要对象引用”错误。您能否以更准确的方式展示如何做到这一点?
【解决方案2】:

我的示例假设您将 Activity 作为参数传递给静态函数。

如果在 OnCreate 末尾的 MainActivity 中说您只需添加以下行会发生什么。

AndroidX.Fragment.App.FragmentManager fm = this.SupportFragmentManager;

如果你愿意,你可以不写“this”,编辑器也会建议你去掉“this”,因为如果你在MainActivity中,“this”已经是Activity了。 “this”将变灰,编辑器会声明此行可以简化。

您需要完整的 AndroidX.Fragment.App.FragmentManager 而不仅仅是 FragmentManager 的原因是您可能还在 MainActivity 顶部的 using 语句中使用了 Andriod.App。您不想要旧的 Android.App.FragmentManager,因此您必须使用完整的命名空间。

如果您尝试从 Fragment 内部获取片段管理器,那么您需要以下内容

AndroidX.Fragment.App.FragmentManager fm = Activity.SupportFragmentManager.

【讨论】:

  • 如果在我的 Oncreate 结束时,我添加了这段代码,正如你提到的,AndroidX.Fragment.App.FragmentManager fm = this.SupportFragmentManager;,我得到:错误 CS0029 无法隐式转换类型' Android.Support.V4.App.FragmentManager' 到 'AndroidX.Fragment.App.FragmentManager' GPSSatellite5 C:\code\Xamarin\GPSSatellite6\GPSSatellite5\MapActivity.cs。顺便说一句,我的最低版本为 10,目标为 11。尝试时你会得到什么?
  • 您正在尝试同时使用 Xamarin.Android.Support 库和 Xamarin.AndroidX 库。 Android.Support 库都已弃用,并且自 Android10 以来一直存在。您需要将所有这些库迁移到 Xamarin.AndroidX 库。我从未使用过它,但有一个 AndroidX 迁移包可以帮助迁移 - 也许你可以看看。
猜你喜欢
  • 2021-02-16
  • 1970-01-01
  • 2011-05-14
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-16
  • 2020-12-30
  • 2018-03-29
相关资源
最近更新 更多