1

これまで、アプリの最初に(スプラッシュの後で)LoginScreenを開始しました。

public class StartApplicationObject
        : MvxApplicationObject
        , IMvxStartNavigation
{
    public void Start()
    {
        //this.RequestNavigate<AddressSearchViewModel>();
        //this.RequestNavigate<MainScreenViewModel>();
        this.RequestNavigate<LoginViewModel>();

    }

    public bool ApplicationCanOpenBookmarks
    {
        get { return true; }
    }
}

さて、今私はそれを変更する必要があります。このLoginViewで、Webサービスからのデータを入力しています。つまり、すでにWebサービスのURL(私の場合はPreferenceActivity)を設定する必要があります。

そのため、 StartView / Activityとして(もうLogin Oneではなく)そのPreferenceScreenが必要です。

PreferenceActivity:

[Activity]
public class SettingsShowActivity : PreferenceActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        AddPreferencesFromResource(Resource.Xml.PreferenceScreen);
    }
}

PreferenceScreenにはViewModelがないため、このタスクを実行する方法がわかりません。でアクティビティを呼び出す方法StartApplicationObject.cs、または回避策が必要ですか?たぶん私はまた、後でPreferenceActivityからLoginView(Model)にナビゲートできるようにする必要があることを追加する必要があります。この場合も..それを行う方法は?

どんな助けでもいただければ幸いです!

編集:

答えはThxStuart!、私はあなたの2番目のアプローチを試しました-私自身のMvxPreferenceActivityを作成します。それはそのように見えます:

using System;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Preferences;
using Cirrious.MvvmCross.Android.Interfaces;
using Cirrious.MvvmCross.ExtensionMethods;
using Cirrious.MvvmCross.Interfaces.ServiceProvider;
using Cirrious.MvvmCross.Interfaces.ViewModels;
using Cirrious.MvvmCross.Platform.Diagnostics;

namespace INMobileCRM4Android
{
    public abstract class MvxPreferenceActivity<TViewModel>
    : PreferenceActivity
    , IMvxAndroidView<TViewModel>
    , IMvxServiceConsumer<IMvxIntentResultSink>
    where TViewModel : class, IMvxViewModel
    {
        protected MvxPreferenceActivity()
        {
            IsVisible = true;
        }

        #region Common code across all android views - one case for multiple inheritance?

        private TViewModel _viewModel;

        public Type ViewModelType
        {
            get { return typeof(TViewModel); }
        }

        public bool IsVisible { get; private set; }

        public TViewModel ViewModel
        {
            get { return _viewModel; }
            set
            {
                _viewModel = value;
                OnViewModelSet();
            }
        }

        public void MvxInternalStartActivityForResult(Intent intent, int requestCode)
        {
            base.StartActivityForResult(intent, requestCode);
        }

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            this.OnViewCreate();
        }

        protected override void OnDestroy()
        {
            this.OnViewDestroy();
            base.OnDestroy();
        }

        protected override void OnNewIntent(Intent intent)
        {
            base.OnNewIntent(intent);
            this.OnViewNewIntent();
        }

        protected abstract void OnViewModelSet();

        protected override void OnResume()
        {
            base.OnResume();
            IsVisible = true;
            this.OnViewResume();
        }

        protected override void OnPause()
        {
            this.OnViewPause();
            IsVisible = false;
            base.OnPause();
        }

        protected override void OnStart()
        {
            base.OnStart();
            this.OnViewStart();
        }

        protected override void OnRestart()
        {
            base.OnRestart();
            this.OnViewRestart();
        }

        protected override void OnStop()
        {
            this.OnViewStop();
            base.OnStop();
        }

        public override void StartActivityForResult(Intent intent, int requestCode)
        {
            switch (requestCode)
            {
                case (int)MvxIntentRequestCode.PickFromFile:
                    MvxTrace.Trace("Warning - activity request code may clash with Mvx code for {0}", (MvxIntentRequestCode)requestCode);
                    break;
                default:
                    // ok...
                    break;
            }
            base.StartActivityForResult(intent, requestCode);
        }

        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            this.GetService<IMvxIntentResultSink>().OnResult(new MvxIntentResultEventArgs(requestCode, resultCode, data));
            base.OnActivityResult(requestCode, resultCode, data);
        }

        #endregion
    }
}

しかし、私は次のエラーを受け取り続けます:

'INMobileCRM4Android.MvxPreferenceActivity<TViewModel>' does not contain a definition for 'OnViewPause' and no extension method 'OnViewPause' accepting a first argument of type 'INMobileCRM4Android.MvxPreferenceActivity<TViewModel>' could be found (are you missing a using directive or an assembly reference?)   

また、このエラーは次の場合にも繰り返されます。this.OnViewCreate(); 、this.OnViewNewIntent(); 、this.OnViewNewIntent(); 、this.OnViewResume(); 、this.OnViewStart(); 、this.OnViewRestart(); およびthis.OnViewStop();

そして最後に、他に3つのエラーがあります。

No overload for method 'OnViewCreate' takes 0 arguments 

OnViewCreate()およびOnViewNewIntent()の場合..

私はあなたからコードを取りましたが、それはそうでした-しかし、いくつかのものが欠けているようですか?

4

1 に答える 1

1

必要に応じて、MvvmCrossの外部でこれを行うことができます。

SplashScreenを置き換える特別なSplashScreenを提供することを検討してください-https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Droid/Views/MvxBaseSplashScreenActivity.cs独自の機能を備えています。

次に、SettingsShowActivityで(特別なセットアップが終了したら)、MvvmCrossIMvxStartNavigation操作をトリガーできます。


しかし...それを言った...

おそらく、SettingsShowActivityのViewModelを作成し、これを通常のMvvmCrossアプリケーションフローに統合することで、これを実装します。

問題がPreferenceActivityのMvxバージョンが必要なことである場合は、MvxPreferenceActivityの作成を検討してください。MvvmCrossmonodroidActivity内にMonogameビューを挿入するの回答を参照してください。

于 2012-12-04T16:59:14.213 に答える