如何使用 MvxCachingFragmentActivity 的示例

Example of how to use MvxCachingFragmentActivity

更新 - 感谢@Martijn00 和@Plac3Hold3r 我已经设法更新我的应用程序以使用 MvxCachingFragmentCompatActivity 但它无法正常工作。我发现如果我返回,有时 ViewModel 将可用,但视图模型中的命令将为空。

此外,如果我先返回再前进,某些按钮不会响应。我认为这是同一个问题。

我真正需要知道的是缓存 activity 给我的附加功能是什么,以及如何正确使用它。

原问题如下...

我遇到了片段的视图模型为空的问题。我怀疑我的 activity 在我打开相机 activity 时被清理了。对于我所有的应用程序,我都使用一个 activity,我所有的视图都是片段。

当相机 activity 完成时,activity 被重建,但其中一个片段视图模型为空。我目前正在为我的单身 activity 使用 AppCompatActivity,但通过我的研究,我可能应该使用 MvxCachingFragmentActivity。问题是我不知道我应该如何使用它。我在任何地方都找不到明确的解释。

有没有人有关于如何使用 MvxCachingFragmentActivity 或 MvxCachingFragmentCompatActivity 的工作示例。

我找不到任何地方告诉我应该如何使用它。

我找到了另一个 link ,但我认为它已过时,并且此示例中给出的另一个 link 是 404。

如果有人知道一个简单的示例以及它是否适用于单个 activity 请告诉我。

谢谢

设置

主要Activity

创建一个继承自 MvxCachingFragmentCompatActivityMvxCachingFragmentActivity 的 activity。

[Activity]
public class MainActivity : BaseFragmentActivity<MainContainerViewModel>
{
}

MainContainerViewModel

创建一个视图模型以关联到 Activity。您永远不会直接使用此 Viewmodel 进行导航。相反,您将通过指定 MainContainerViewModel 作为其父视图模型的片段导航到此视图模型。

public class MainContainerViewModel : MvxViewModel
{
}

XML布局示例

为您的 MainActivity 添加布局。确保包含具有 ID 的 FrameLayout。在这种情况下 content_frame。这个 id 很重要,因为这是您将如何识别放置片段的框架的方式。如果您想要同一视图的多个片段,请指定多个 FrameLayout's

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/coordinator_layout"
  android:layout_width="match_parent"
  android:layout_height="match_parent">

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

      <android.support.v7.widget.Toolbar
          android:id="@+id/toolbar"
          android:layout_width="match_parent"
          android:layout_height="?attr/actionBarSize"
          android:background="?attr/colorPrimary">

        <TextView
            android:id="@+id/textview_toolbar_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@android:color/white"
            android:layout_gravity="left"
            style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title" />

      </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout>

      <FrameLayout
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

  </LinearLayout>

</android.support.design.widget.CoordinatorLayout>

HomeFragment

就片段而言,您需要包含 MvxFragment 属性,该属性需要将 Viewmodel 类型关联到您要放置片段的 Activity。此外,您需要指定在活动布局上找到的 FrameLayout 的 ID,您要在其中放置片段。

[MvxFragment(typeof(MainContainerViewModel), Resource.Id.content_frame)]
[Register(nameof(HomeFragment))]
public class HomeFragment : BaseFragment<HomeViewModel>
{
}

用法

现在导航时可以使用 ShowViewModel<HomeViewModel>() 导航到主页片段。但是,重要的是,它会在进行片段导航之前首先启动所需的 Activity MainActivity。这允许与不需要这些容器视图模型的其他平台更好地共享导航,即它们通过约定自动处理。


备注

您可以指定多个 MvxFragment 属性。如果您希望在多个 Activity 下共享相同的片段,则 Is 很有用。 Top MvxFragment 属性将用作默认值。如果您当前处于任何其他匹配 MvxFragment 属性的上下文中,则导航将在该 activity.

下进行

如果您的 Setup.cs 不是从 MvxAppCompatSetup 继承的,或者您使用的是自定义演示者,则需要确保您还针对 IMvxAndroidViewPresenter 注册了演示者。这很重要,因为 MvxCachingFragmentCompatActivityMvxCachingFragmentActivity 解析 IMvxAndroidViewPresenter 以便导航到所需的片段。

protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
    var mvxFragmentsPresenter = new MvxFragmentsPresenter(AndroidViewAssemblies);
    Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxFragmentsPresenter);
    return mvxFragmentsPresenter;
}

您还可以查看 Sample Repo 中的使用示例。