Customization
Mainactivity
Create an action that inherits from MvxCachingFragmentCompatActivity
or MvxCachingFragmentActivity
.
[Activity] public class MainActivity : BaseFragmentActivity<MainContainerViewModel> { }
MainContainerViewModel
Create a Viewmodel to bind to an Activity. You will never navigate directly using this Viewmodel. Instead, you will navigate to this Viewmodel using fragments that set MainContainerViewModel
as the parent model of the Viewmodel.
public class MainContainerViewModel : MvxViewModel { }
XML Layout Example
Add a layout to your MainActivity
. Remember to include FrameLayout
with id. In this case, content_frame
. This identifier is important because you define the frame where to place your fragment. You specify multiple FrameLayout's
if you want more than one fragment for the same view.
<?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
In terms of fragments, you need to include the MvxFragment
attribute, which needs the Viewmodel type associated with the activity in which you want to place your fragment. In addition, you need to specify the identifier for FrameLayout
, which is found in the action layout where you want to place the fragment.
[MvxFragment(typeof(MainContainerViewModel), Resource.Id.content_frame)] [Register(nameof(HomeFragment))] public class HomeFragment : BaseFragment<HomeViewModel> { }
Using
When navigating, you can now use ShowViewModel<HomeViewModel>()
, which will move around the home fragment. But, importantly, you must first run the required MainActivity
before navigating the fragment. This allows you to improve overall navigation with other platforms that do not require these Viewmodels containers, i.e. Automatically processed through agreement.
Notes
You can specify multiple MvxFragment
attributes. This is useful if you want the same fragment to be separated by several actions. The Top MvxFragment
will be used by default. If you are currently in the context of any other MvxFragment
attribute MvxFragment
, then navigation will occur.
If your Setup.cs is not inherited from MvxAppCompatSetup
or you are using a custom presenter, you need to make sure that you also register the presenter with IMvxAndroidViewPresenter
. This is important as MvxCachingFragmentCompatActivity
or MvxCachingFragmentActivity
allow IMvxAndroidViewPresenter
to go to the desired fragment.
protected override IMvxAndroidViewPresenter CreateViewPresenter() { var mvxFragmentsPresenter = new MvxFragmentsPresenter(AndroidViewAssemblies); Mvx.RegisterSingleton<IMvxAndroidViewPresenter>(mvxFragmentsPresenter); return mvxFragmentsPresenter; }
You can also check out Sample Repo for an example of this.