如何使用 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
创建一个继承自 MvxCachingFragmentCompatActivity
或 MvxCachingFragmentActivity
的 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
注册了演示者。这很重要,因为 MvxCachingFragmentCompatActivity
或 MvxCachingFragmentActivity
解析 IMvxAndroidViewPresenter
以便导航到所需的片段。
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var mvxFragmentsPresenter = new MvxFragmentsPresenter(AndroidViewAssemblies);
Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxFragmentsPresenter);
return mvxFragmentsPresenter;
}
您还可以查看 Sample Repo 中的使用示例。
更新 - 感谢@Martijn00 和@Plac3Hold3r 我已经设法更新我的应用程序以使用 MvxCachingFragmentCompatActivity 但它无法正常工作。我发现如果我返回,有时 ViewModel 将可用,但视图模型中的命令将为空。
此外,如果我先返回再前进,某些按钮不会响应。我认为这是同一个问题。
我真正需要知道的是缓存 activity 给我的附加功能是什么,以及如何正确使用它。
原问题如下...
我遇到了片段的视图模型为空的问题。我怀疑我的 activity 在我打开相机 activity 时被清理了。对于我所有的应用程序,我都使用一个 activity,我所有的视图都是片段。
当相机 activity 完成时,activity 被重建,但其中一个片段视图模型为空。我目前正在为我的单身 activity 使用 AppCompatActivity,但通过我的研究,我可能应该使用 MvxCachingFragmentActivity。问题是我不知道我应该如何使用它。我在任何地方都找不到明确的解释。
有没有人有关于如何使用 MvxCachingFragmentActivity 或 MvxCachingFragmentCompatActivity 的工作示例。
我找不到任何地方告诉我应该如何使用它。
我找到了另一个 link
如果有人知道一个简单的示例以及它是否适用于单个 activity 请告诉我。
谢谢
设置
主要Activity
创建一个继承自 MvxCachingFragmentCompatActivity
或 MvxCachingFragmentActivity
的 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
注册了演示者。这很重要,因为 MvxCachingFragmentCompatActivity
或 MvxCachingFragmentActivity
解析 IMvxAndroidViewPresenter
以便导航到所需的片段。
protected override IMvxAndroidViewPresenter CreateViewPresenter()
{
var mvxFragmentsPresenter = new MvxFragmentsPresenter(AndroidViewAssemblies);
Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxFragmentsPresenter);
return mvxFragmentsPresenter;
}
您还可以查看 Sample Repo 中的使用示例。