2017-08-15 3 views
1

J'ai créé une simple application Xamarin Forms avec MvvmCross pour essayer de comprendre une erreur que j'ai sur un autre projet. Cette application simple est disponible ici: https://github.com/selaromdotnet/XamFormsAppTestMvvmCross et Xamarin Forms, l'application Android se bloque avec une erreur de référence nulle lors de l'obtention de la couleur d'accent

Il a une seule page avec un élément de barre d'outils qui a une icône dessus.

Si vous regardez l'historique des validations, ce projet se charge très bien et l'icône le fait également.

Mais dans le plus récent commit, j'ai suivi ce guide ici (https://blog.xamarin.com/material-design-for-your-xamarin-forms-android-apps/) et ce post ici (Xamarin.Forms null reference exception when applying Material Theme) pour mettre à jour le projet pour utiliser MvvmCross avec la conception matérielle.

maintenant sur l'application Android, la méthode OnCreate pour le MvxFormsAppCompatActivity il se bloque avec cette erreur:

System.NullReferenceException: Object reference not set to an instance of an object. 
    at Xamarin.Forms.Forms.GetAccentColor() [0x00006] inC:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\Forms.cs:159 
    at Xamarin.Forms.Forms.SetupInit (Android.Content.Context activity, System.Reflection.Assembly resourceAssembly) [0x0000c] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\Forms.cs:118 
    at Xamarin.Forms.Forms.Init (Android.Content.Context activity, Android.OS.Bundle bundle) [0x00006] in C:\BuildAgent3\work\ca3766cfc22354a1\Xamarin.Forms.Platform.Android\Forms.cs:72 
    at MvvmCross.Forms.Droid.MvxFormsAndroidSetup.CreateViewPresenter() [0x00000] in C:\projects\mvvmcross\MvvmCross-Forms\MvvmCross.Forms.Droid\MvxFormsAndroidSetup.cs:55 
    at MvvmCross.Droid.Platform.MvxAndroidSetup.CreateViewDispatcher() [0x00000] in C:\projects\mvvmcross\MvvmCross\Droid\Droid\Platform\MvxAndroidSetup.cs:124 
    at MvvmCross.Core.Platform.MvxSetup.InitializeViewDispatcher() [0x00000] in C:\projects\mvvmcross\MvvmCross\Core\Core\Platform\MvxSetup.cs:260 
    at MvvmCross.Core.Platform.MvxSetup.InitializeSecondary() [0x000f8] in C:\projects\mvvmcross\MvvmCross\Core\Core\Platform\MvxSetup.cs:91 
    at MvvmCross.Core.Platform.MvxSetup.Initialize() [0x00006] in C:\projects\mvvmcross\MvvmCross\Core\Core\Platform\MvxSetup.cs:37 
    at MvvmCross.Droid.Platform.MvxAndroidSetupSingleton.EnsureInitialized() [0x0004e] in C:\projects\mvvmcross\MvvmCross\Droid\Droid\Platform\MvxAndroidSetupSingleton.cs:45 
    at MvvmCross.Forms.Droid.MvxFormsAppCompatActivity.OnCreate (Android.OS.Bundle bundle) [0x00013] in C:\projects\mvvmcross\MvvmCross-Forms\MvvmCross.Forms.Droid\MvxFormsAppCompatActivity.cs:64 
    at XamFormsAppTest.Droid.MainActivity.OnCreate (Android.OS.Bundle bundle) [0x00017] in D:\VisualStudio\OSS\XamFormsAppTest\XamFormsAppTest\XamFormsAppTest.Android\MainActivity.cs:21 
    at Android.Support.V4.App.FragmentActivity.n_OnCreate_Landroid_os_Bundle_(System.IntPtr jnienv, System.IntPtr native__this, System.IntPtr native_savedInstanceState) [0x0000f] in 8b5e0f4c6f594871ab0afcbcb2317289>:0 
    at (wrapper dynamic-method) System.Object:6ce77b2f-ee95-4ad0-bd89-6baa2e4d7b05> (intptr,intptr,intptr) 

Je devine que ce n'est pas trouver la couleur correctement dans les ressources, mais je suis à une perte pour savoir comment pour résoudre ce problème. J'ai essayé de changer le nom de fichier en color.xml et essayé de définir l'accentColor comme une couleur au lieu d'une référence à @ couleur/accent ...

Je suis vraiment coincé ici et je ne sais pas comment résoudre ce problème. Quelqu'un peut-il me dire ce que je fais mal avec mon projet?

Répondre

1

Object reference not set to an instance of an object.

Tout d'abord, s'il vous plaît assurez-vous d'avoir lu le Official tutorial pour créer un projet MvvmCross avec Xamarin.Forms. Voici comment créer un projet MvvmCross Forms. Veuillez modifier votre code MainPage.xaml en fonction du document.

On pourrait trouver que le NullReferenceException a un ordre:

MainActivity.OnCreate --> MvxFormsAppCompatActivity.OnCreate --> .. --> Init --> SetupInit --> GetAccentColor 

Il était nul lorsque la méthode appel MainActivity.OnCreate du système, afin que nous puissions en déduire que de ne pas trouver la couleur correctement dans les ressources parce que votre MainActivity n'a pas été initialisé. Nous devrions appeler la méthode OnCreate de MainActivity après sa préparation. Il semble nous devons ajouter un SplashScreen pour initialiser une ressource.

Voici mon code:

[Activity(
    Label = "MvxForms" 
    , MainLauncher = true 
    , Icon = "@drawable/icon" 
    , NoHistory = true 
    , ScreenOrientation = ScreenOrientation.Portrait)] 
public class SplashScreen : MvxSplashScreenActivity 
{ 
    public SplashScreen() 
     : base(Resource.Layout.SplashScreen) 
    { 
    } 

    protected override void TriggerFirstNavigate() 
    { 
     StartActivity(typeof(MainActivity)); 
     base.TriggerFirstNavigate(); 
    } 
} 

Ensuite, votre NullReferenceException sera parti, mais après avoir fait cela, son avoir encore Exception:

FATAL UNHANDLED EXCEPTION: MvvmCross.Platform.Exceptions.MvxException: 
Problem seen creating View-ViewModel lookup table 
- you have more than one View registered for the ViewModels: 2*MainViewModel (MainActivity,MainPage) 
---> System.ArgumentException: An item with the same key has already been added. 

If your ViewModel is called MainViewModel and your Forms page is too, you might get a name conflict because MvvmCross will have 2 view to viewmodel lookups. You can prevent this by naming your Activity differently like "FormsActivity.cs".

Vous pouvez également renommer votre MainViewModel à MvxMainViewModel (tout ce que vous voulez), alors cette exception disparaîtra.

+0

@SelAromDotNet, avez-vous résolu ce problème? –