在mvvmCross中使用片段时出现以下问题。我借用了https://github.com/slodge/MvvmCross-Tutorials/tree/master/Fragments的代码。 https://github.com/slodge/MvvmCross-Tutorials/blob/master/Fragments/FragmentSample.UI.Droid/Setup.cs中的Framepresenter类解析了在show方法中显示视图模型的请求
public class CustomPresenter : MvxAndroidViewPresenter , ICustomPresenter { private Dictionary _dictionary = new Dictionary(); public override void Show(MvxViewModelRequest request) { IFragmentHost host; if (_dictionary.TryGetValue(request.ViewModelType, out host)) { if (host.Show(request)) { return; } } base.Show(request); } ...
在第一轮比赛中一切顺利。如果我用android的“后退”按钮关闭应用程序并再次打开它,我将在基类的Show方法(MvxAndroidViewPresenter)中获得空指针异常。这是因为顶级活动不再存在。 MvxAndroidViewPresenter中的属性Activity返回null。如何重新启动应用程序时重新创建顶级活动?
我收到以下异常
06-26 16:06:28.102 I/MonoDroid( 6791): UNHANDLED EXCEPTION: System.NullReferenceException: Object reference not set to an instance of an object 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxAndroidViewPresenter.Show (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest) [0x0000f] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxAndroidViewPresenter.cs:29 06-26 16:06:28.102 I/MonoDroid( 6791): at ManCockpit.UI.Droid.CockpitFragmentPresenter.Show (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest) [0x00040] in d:\Projekte\ManCockpitV2\ManCockpit.UI.Droid\CockpitFragmentPresenter.cs:41 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxAndroidViewDispatcher/c__DisplayClass1.b__0 () [0x00000] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxAndroidViewDispatcher.cs:27 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxAndroidViewDispatcher.ShowViewModel (Cirrious.MvvmCross.ViewModels.MvxViewModelRequest) [0x00015] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxAndroidViewDispatcher.cs:27 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxNavigatingObject.ShowViewModelImpl (System.Type,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.MvxRequestedBy) 06-26 16:06:28.102 I/MonoDroid( 6791): at (wrapper dynamic-method) objec06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxNavigatingObject.ShowViewModel (System.Type,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.MvxRequestedBy) 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxNavigatingObject.ShowViewModel (Cirrious.MvvmCross.ViewModels.IMvxBundle,Cirrious.MvvmCross.ViewModels.MvxBundle,Cirrious.MvvmCross.ViewModels.MvxRequestedBy) 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.ViewModels.MvxAppStart`1.Start (object) 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxSplashScreenActivity.TriggerFirstNavigate () [0x00007] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxSplashScreenActivity.cs:82 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxSplashScreenActivity.InitializationComplete () [0x00001] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxSplashScreenActivity.cs:76 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Platform.MvxAndroidSetupSingleton.InitialiseFromSplashScreen (Cirrious.MvvmCross.Droid.Views.IMvxAndroidSplashScreenActivity) [0x00036] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Platform\MvxAndroidSetupSingleton.cs:76 06-26 16:06:28.102 I/MonoDroid( 6791): at Cirrious.MvvmCross.Droid.Views.MvxSplashScreenActivity.OnCreate (Android.OS.Bundle) [0x00014] in d:\Projekte\MvvmCross\mvvmcross-20130621\Cirrious\Cirrious.MvvmCross.Droid\Views\MvxSplashScreenActivity.cs:47 06-26 16:06:28.102 I/MonoDroid( 6791): at ManCockpit.UI.Droid.SplashScreenActivity.OnCreate (Android.OS.Bundle) [0x0002e] in d:\Projekte\ManCockpitV2\ManCockpit.UI.Droid\SplashScreenActivity.cs:105 06-26 16:06:28.102 I/MonoDroid( 6791): at Android.App.Activity.n_OnCreate_Landroid_os_Bundle_ (intptr,intptr,intptr) [0x00010] in /Users/builder/data/lanes/monodroid-lion-bs1/0cc7ae3b/source/monodroid/src/Mono.Android/platforms/android-15/src/generated/Android.App.Activity.cs:1859 06-26 16:06:28.102 I/MonoDroid( 6791): at (wrapper dynamic-method) object.08473369-0d89-4344-a57c-40e97793bab8 (intptr,intptr,intptr)
答案 0 :(得分:0)
这看起来与碎片无关 - 而是一个已知的错误 - https://github.com/slodge/MvvmCross/issues/316
此修复程序尚未发布给nuget。
要解决此问题,您可以自行构建修复程序。或者,您可以通过添加以下内容来覆盖splashscreen类中的行为:
private bool _isResumed;
protected override void OnResume()
{
_isResumed = true;
base.OnResume();
}
protected override void OnPause()
{
_isResumed = false;
base.OnPause();
}
public override void InitializationComplete()
{
if (!_isResumed)
return;
TriggerFirstNavigate();
}