2017-02-20 11 views
0

Обновление - Благодаря @ Martijn00 и @ Plac3Hold3r Мне удалось обновить мое приложение, чтобы использовать MvxCachingFragmentCompatActivity, но он просто не работает правильно. Я нахожу, что, если я снова вернусь, ViewModel будет доступен, но команды в модели представления будут пустыми.Пример использования MvxCachingFragmentActivity

Также, если я вернусь, а затем перейду, некоторые из кнопок не отвечают. Я предполагаю, что это та же проблема.

Что мне действительно нужно знать, так это то, что дает мне дополнительная функция кеширования и как правильно ее использовать.

Оригинальный вопрос следует ...

Я ударяя проблема, когда модель представления для фрагмента равна нулю. Я подозреваю, что моя активность очищается, когда я открываю активность камеры. Для всех моих приложений я использую одно действие, и все мои представления - это фрагменты.

Когда действие камеры завершено, активность восстанавливается, но одна из моделей просмотра фрагментов равна нулю. В настоящее время я использую AppCompatActivity для моего единственного действия, но в ходе моих исследований я, вероятно, должен использовать MvxCachingFragmentActivity. Проблема в том, что я понятия не имею, как я должен ее использовать. Я не могу найти ясного объяснения нигде.

У кого-нибудь есть рабочий пример того, как использовать MvxCachingFragmentActivity или MvxCachingFragmentCompatActivity.

Я не могу найти нигде, где он говорит мне, как я должен его использовать.

Я нашел другую ссылку example, но я думаю, что это устарело и другой ссылке, приведенной в данном примере является 404.

Если кто-нибудь знает простой образец и будет ли это работать с одним видом деятельности пожалуйста, дай мне знать.

Благодаря

+0

Это сейчас: https://github.com/MvvmCross/MvvmCross/tree/develop/TestProjects/Android-Support/Fragments/Example.Droid – Martijn00

+0

Привет, Мартин, спасибо за это. Все еще не уверен, что делать. Это всего лишь вопрос о том, что моя единственная деятельность будет MvxCachingFragmentCompatActivity, а не AppCompatActivity. Я попробовал это, но не удался, все еще разбился при попытке восстановить активность. У меня есть собеседник, в этом случае я должен что-то делать. Есть ли хорошие статьи, которые объясняют, что должно произойти? Жаль, что это боль. – rideintothesun

ответ

3

Настройка

MainActivity

Создайте деятельность, которая наследуется от MvxCachingFragmentCompatActivity или MvxCachingFragmentActivity.

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

MainContainerViewModel

Создать ViewModel связать с деятельности. Вы никогда не будете перемещаться напрямую, используя эту Viewmodel. Вместо этого вы перейдете к этой Viewmodel с помощью фрагментов, которые определяют MainContainerViewModel как Viewmodel своего родителя.

public class MainContainerViewModel : MvxViewModel 
{ 
} 

XML Пример компоновки

Добавить макет по своему MainActivity. Обязательно укажите FrameLayout с идентификатором. В этом случае content_frame.Этот идентификатор важен, так как вы определяете кадр, где разместить свой фрагмент. Вы указываете несколько 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 ассоциированное к деятельности вы хотите поместить фрагмент в. Кроме того, необходимо чтобы указать идентификатор для FrameLayout, который находится в макете действий, где вы хотите поместить фрагмент.

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

Использование

При перемещении вашего теперь можно использовать ShowViewModel<HomeViewModel>(), который будет перемещаться к дому фрагмента. Но, что важно, сначала начнется требуемая активность MainActivity перед выполнением навигации фрагмента. Это позволяет улучшить общую навигацию с другими платформами, которые не требуют этих контейнеров Viewmodels, т. Е. Они автоматически обрабатываются посредством соглашения.


Примечания

Вы можете указать несколько MvxFragment атрибутов. Это полезно, если вы хотите, чтобы один и тот же фрагмент был разделен несколькими действиями. Атрибут Top MvxFragment будет использоваться по умолчанию. Если вы в настоящее время находитесь в контексте любого другого подходящего атрибута MvxFragment, тогда при этом будет осуществляться навигация.

Если ваш Setup.cs не наследуется от MvxAppCompatSetup, или вы используете пользовательский презентатор, вам необходимо убедиться, что вы также регистрируете презентатора против IMvxAndroidViewPresenter. Это важно, так как MvxCachingFragmentCompatActivity или MvxCachingFragmentActivity разрешите IMvxAndroidViewPresenter, чтобы перейти к нужному фрагменту.

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

Вы также можете проверить Sample Repo для примера этого использования.

+0

(1) Спасибо Plac3Hold3r. Это полезно, но это не та часть, которую я не понимаю. Бит, который я не понимаю, является частью кэширования MvxCachingFragmentActivity или MvxCachingFragmentCompatActivity. Я понимаю, что если активность приложения необходимо восстановить из-за платформы, которая ранее нуждалась в ресурсах, то аспект кеширования этих типов активности обеспечивает функциональность кэширования фрагментов и восстановления фрагментов при восстановлении активности. – rideintothesun

+0

(2) В настоящее время происходит то, что одна из моделей просмотра фрагментов равна null при восстановлении активности. Мне нужно знать, нужно ли мне что-либо сделать, чтобы эта функция кеширования работала. Если да, то что мне нужно сделать? – rideintothesun

+0

Если вы добавили 'protected override void ShowFragment (string tag, int contentId, Bundle bundle, bool forceAddToBackStack = false, bool forceReplaceFragment = false) { base.ShowFragment (tag, contentId, bundle, forceAddToBackStack, true); } 'к вашему' MvxCachingFragmentActivity' все еще происходит? Этот код можно использовать для принудительного обновления фрагмента и viewmodel. – Plac3Hold3r

Смежные вопросы