如何使用MvxCachingFragmentActivity的示例

时间:2017-02-20 14:05:24

标签: android caching xamarin mvvmcross android-fragmentactivity

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

此外,如果我回去然后前进,一些按钮不会响应。我认为这是同一个问题。

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

原始问题如下......

我遇到的问题是片段的视图模型为null。当我打开相机活动时,我怀疑我的活动正在被清除。对于我的所有应用程序,我使用单个活动,我的所有视图都是碎片。

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

有没有人有一个如何使用MvxCachingFragmentActivity或MvxCachingFragmentCompatActivity的实例。

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

我发现了另一个链接example,但我认为它已过时,此示例中给出的另一个链接是404.

如果有人知道一个简单的样本,以及这是否适用于单个活动,请告诉我。

由于

1 个答案:

答案 0 :(得分:3)

设置

<强> MainActivity

创建一个继承自MvxCachingFragmentCompatActivityMvxCachingFragmentActivity

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

<强> MainContainerViewModel

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

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属性,该属性需要与要放置片段的Activity关联的Viewmodel类型。此外,您需要指定{{1}的ID您可以在活动布局中找到要放置片段的位置。

FrameLayout

<强>用法

导航时,现在可以使用[MvxFragment(typeof(MainContainerViewModel), Resource.Id.content_frame)] [Register(nameof(HomeFragment))] public class HomeFragment : BaseFragment<HomeViewModel> { } 导航到主片段。但是,重要的是,它会在进行片段导航之前首先启动所需的Activity ShowViewModel<HomeViewModel>()。这允许与不需要这些容器Viewmodel的其他平台进行更好的共享导航,即通过约定自动处理它们。

<强> 备注

您可以指定多个MainActivity属性。如果您希望在多个活动下共享相同的片段,那么这是有用的。 Top MvxFragment属性将用作默认值。如果您当前处于任何其他匹配MvxFragment属性的上下文中,则会在该活动下进行导航。

如果您的Setup.cs未继承自MvxFragment,或者您使用的是自定义演示者,则需要确保还要针对MvxAppCompatSetup注册演示者。这一点很重要,因为IMvxAndroidViewPresenterMvxCachingFragmentCompatActivity解析MvxCachingFragmentActivity才能导航到所需的片段。

IMvxAndroidViewPresenter

您还可以查看Sample Repo中的相关示例。