Кросс-исключение MVVM: невозможно создать фрагмент. Используйте MvxAppCompatViewPresenter при использовании Android Фрагментов поддержки - PullRequest
0 голосов
/ 30 апреля 2020

У меня проблемы с запуском фрагментов, и я получаю следующее исключение. Кросс-исключение MVVM: невозможно создать фрагмент. Используйте MvxAppCompatViewPresenter при использовании Android Фрагменты поддержки.

Вот MainViewModel, где он должен перейти к первому фрагменту / ViewModel (ActionViewModel).

    public class MainViewModel : BaseViewModel
    {
        public IMvxCommand<string> BottomNavigationItemSelectedCommand { get; private set; }

        List<TabViewModel> _tabs;
        public List<TabViewModel> Tabs
        {
            get => _tabs;
            set => SetProperty(ref _tabs, value);
        }

        private readonly IMvxNavigationService _navigationService;

        public MainViewModel(IMvxNavigationService navigationService)
        {
            _navigationService = navigationService;
            BottomNavigationItemSelectedCommand = new MvxCommand<string>(BottomNavigationItemSelected);

            var tabs = new List<TabViewModel>
            {
                Mvx.IoCProvider.IoCConstruct<ActionViewModel>(),
                Mvx.IoCProvider.IoCConstruct<TaskViewModel>(),
                Mvx.IoCProvider.IoCConstruct<KpiViewModel>(),
                Mvx.IoCProvider.IoCConstruct<EisViewModel>(),
                Mvx.IoCProvider.IoCConstruct<MenuViewModel>()
            };

            Tabs = tabs;
        }

        public override Task Initialize()
        {
            return base.Initialize();
        }


        // Android-only, not used on iOS
        private void BottomNavigationItemSelected(string tabId)
        {
            if (tabId == null)
            {
                return;
            }

            foreach (var item in Tabs)
            {
                if (tabId == item.TabId)
                {
                    _navigationService.Navigate(item);
                    break;
                }
            }
        }
    }
}

И это ActionFragment:

    [MvxFragmentPresentation(typeof(MainViewModel), Resource.Id.fragment_content, true)]
    [Register(nameof(ActionFragment))]
    public class ActionFragment : BaseFragment<ActionViewModel>
    {
        //public static ActionFragment NewInstance() => new ActionFragment();

        public override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }

        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            var view = inflater.Inflate(Resource.Layout.activity_actions, container, false);
            return view;
        }

    }

Это это основной макет деятельности:

<androidx.coordinatorlayout.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:local="http://schemas.android.com/apk/res-auto"
    android:id="@+id/parentView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?android:attr/colorBackground">

    <androidx.appcompat.widget.LinearLayoutCompat
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <androidx.appcompat.widget.ContentFrameLayout
            android:id="@+id/fragment_content"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_weight="1"/>

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:labelVisibilityMode="labeled"
            app:menu="@menu/bottom_nav_menu"
            local:MvxBind="BottomNavigationSelectedBindingKey BottomNavigationItemSelectedCommand"/>

    </androidx.appcompat.widget.LinearLayoutCompat>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Может кто-нибудь, пожалуйста, дайте мне знать, что я должен сделать, чтобы решить эту проблему? Я новичок в этом!

1 Ответ

0 голосов
/ 30 апреля 2020

Я обнаружил, что моя проблема в том, что мне пришлось изменить классы MainApplication.cs и Setup.cs.

с:

public class Setup : MvxAndroidSetup

на

public class Setup : MvxAppCompatSetup<App>

и от:

public class MainApplication : MvxAndroidApplication<MvxAndroidSetup<App>, App>

до

public class MainApplication : MvxAppCompatApplication<Setup, App>
...