2012-12-04 31 views
1

到現在爲止,我開始在我的應用程序的開始LoginScreen(閃後):MonoDroid&MVVMCross - StartApplicationObject,啓動PreferenceActivity?

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中)。

所以我想要PreferenceScreen,作爲StartView/Activity(不是Login One Anymore)。

的PreferenceActivity:

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

我不知道如何去完成這個任務,因爲PreferenceScreen沒有一個視圖模型,因此如何調用該活動StartApplicationObject.cs,或者我需要一個解決方法嗎? 也許我還應該補充說,我需要能夠,以後從PreferenceActivity導航到LoginView(模型)..以及在這種情況下......如何做到這一點?

任何幫助,將不勝感激!

編輯:

THX斯圖爾特的答案!我想你的第二個方法 - 創造我自己的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()..

我把代碼你,因爲它是 - 但似乎有些事情不存在?

回答

1

如果你願意,你可以在MvvmCross之外做到這一點。

着眼於提供一個特殊的SplashScreen,用您自己的功能取代SplashScreen - https://github.com/slodge/MvvmCross/blob/vnext/Cirrious/Cirrious.MvvmCross.Droid/Views/MvxBaseSplashScreenActivity.cs

然後在SettingsShowActivity中 - 完成特殊設置後 - 即可觸發MvvmCross IMvxStartNavigation操作。


但是......話說回來......

我可能會通過使視圖模型的SettingsShowActivity這個集成到您的正常MvvmCross應用程序流實現這一點。

如果問題是您需要PreferenceActivity的Mvx版本,那麼請考慮創建MvxPreferenceActivity - 請參閱Insert a Monogame view inside MvvmCross monodroid Activity中的幫助以獲取幫助。

+0

嗨,斯圖爾特,我剛剛編輯了我的問題 – eMi

+0

儘量避免這種事情,如果可以的話 - 它會混淆這個問題,併爲任何後來的人回答。如果您需要提出一個新問題,請在新問題中進行回答(並返回到舊問題。如果您需要聊天,請http://jabbr.net/#/rooms/mvvmcross – Stuart

+0

我對此編輯的回答是做編譯器告訴你檢查你的'using'語句和你的引用,以便這些擴展方法變得可見。 – Stuart

相關問題