更新 - 感谢@ Martijn00和@ Plac3Hold3r我已经设法更新我的应用程序以使用MvxCachingFragmentCompatActivity,但它无法正常工作。我发现,如果我有时返回ViewModel将可用,但视图模型中的命令将为null。
此外,如果我回去然后前进,一些按钮不会响应。我认为这是同一个问题。
我真正需要知道的是缓存活动给我的附加功能,以及如何正确使用它。
原始问题如下......
我遇到的问题是片段的视图模型为null。当我打开相机活动时,我怀疑我的活动正在被清除。对于我的所有应用程序,我使用单个活动,我的所有视图都是碎片。
当相机活动完成时,将重建活动,但其中一个片段视图模型为空。我目前正在使用AppCompatActivity进行单项活动,但通过我的研究,我应该使用MvxCachingFragmentActivity。问题是我不知道我应该如何使用它。我无法在任何地方找到明确的解释。
有没有人有一个如何使用MvxCachingFragmentActivity或MvxCachingFragmentCompatActivity的实例。
我无法找到告诉我应该如何使用它的任何地方。
我发现了另一个链接example,但我认为它已过时,此示例中给出的另一个链接是404.
如果有人知道一个简单的样本,以及这是否适用于单个活动,请告诉我。
由于
答案 0 :(得分:3)
设置
<强> MainActivity 强>
创建一个继承自MvxCachingFragmentCompatActivity
或MvxCachingFragmentActivity
。
[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
注册演示者。这一点很重要,因为IMvxAndroidViewPresenter
或MvxCachingFragmentCompatActivity
解析MvxCachingFragmentActivity
才能导航到所需的片段。
IMvxAndroidViewPresenter
您还可以查看Sample Repo中的相关示例。