2016-03-28 1 views
1

Je veux afficher un message de toast. Si je le faisais dans onCreate() cela fonctionnerait bien. Mais je veux le faire comme ceci et j'obtiens une erreur:Xamarin Toast Message error (C#)

Java.Lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

Que dois-je faire?

public void textToast(string textToDisplay) {    
    Toast.MakeText(this, 
    textToDisplay, ToastLength.Long).Show(); 
} 
class SampleTabFragment : Fragment 
{ 
    Button add; 
    MainActivity main = new MainActivity(); 
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     base.OnCreateView(inflater, container, savedInstanceState); 
     var view = inflater.Inflate(Resource.Layout.Tab, container, false);  
     add = view.FindViewById<Button>(Resource.Id.add);  
     add.Click += Click; 
     return view; 
    } 
    void Click(object sender, EventArgs eventArgs) 
    {  
     main.textToast("I like Toast!"); 
    } 
} 
+0

Ce que je regarderais est si « ceci » ou la vue à l'intérieur de « ceci » que le message de pain grillé tente d'afficher au-dessus de est nul dans le contexte à partir duquel vous essayez d'afficher le message toast. –

+1

Je recommanderais simplement d'utiliser l'activité dans laquelle le fragment est créé. Vous pouvez utiliser 'getActivity()' dans votre méthode 'onAttach()' pour vous assurer que c'est une référence correcte. –

Répondre

4

Le Java.Lang.NullPointerException est déclenchée parce que vous créez manuellement et à l'aide d'une instance de MainActivity.

Au lieu d'utiliser une instance personnalisée de MainActivity pour afficher votre message de pain grillé dans Click, simplifier votre code pour utiliser les fragments référence activité existante:

public void textToast(string textToDisplay) {    
    Toast.MakeText(this, 
    textToDisplay, ToastLength.Long).Show(); 
} 

class SampleTabFragment : Fragment 
{ 
    Button add; 

    // Remove manual creation code 
    // MainActivity main = new MainActivity(); 

    // ... 

    void Click(object sender, EventArgs eventArgs) 
    {  
     (Activity as MainActivity).textToast("I like Toast!"); 
    } 
} 

Ce code suppose que l'activité possédante est toujours une instance de MainActivity.

Voir:

+0

Merci pour cette oeuvre! – AlGrande

1

Si je comprends bien votre question, je pense qu'une bonne solution peut être celle-ci:

 public void makeToast(Context ctx, string str) 
     { 
      Toast.MakeText(ctx, str, ToastLength.Long).Show(); 
     } 

Et quand vous utilisez-le dans chaque fragment que vous avez, vous pouvez l'appeler simplement écrire:

makeToast(this.Activity, "test!"); 

Works pour moi, laissez-moi savoir :)

+0

Merci, cela fonctionne aussi, mais je vais utiliser la solution de matthewrdev à la place parce que je vais devoir taper moins de code si je vais faire plus de messages toast. – AlGrande

+0

@AlGrande Je voulais juste offrir une solution différente, merci pour le commentaire :) –