2016-03-28 5 views
1

Я хочу показать тост-сообщение. Если я сделаю это в onCreate(), он будет работать нормально. Но я хочу сделать это вот так, и я получаю сообщение об ошибке:Xamarin Toast Ошибка сообщения (C#)

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

Что мне делать?

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

То, что я хотел бы посмотреть на это, если «это» или взгляд изнутри «это», что сообщение тост пытается отобразить на вершине имеет значение null в контексте, из которого вы пытаетесь показать сообщение тоста. –

+1

Я бы порекомендовал просто использовать Activity, для которого создан фрагмент. Вы можете использовать 'getActivity()' в вашем методе 'onAttach()', чтобы убедиться, что это правильная ссылка. –

ответ

4

The Java.Lang.NullPointerException срабатывает потому, что вы вручную создавать и использовать экземпляр MainActivity.

Вместо того, чтобы использовать пользовательский экземпляр MainActivity для отображения тоста сообщения Click, упростить код, чтобы использовать фрагменты существующей ссылку деятельности:

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!"); 
    } 
} 

Этот код предполагает, что владеющее деятельность всегда является экземпляр MainActivity.

См:

+0

Спасибо, что это работает! – AlGrande

1

Если я правильно понимаю ваш вопрос, я думаю, что это хорошее решение может быть это один:

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

И когда ты используйте его в каждом фрагменте, который у вас есть, вы можете его назвать просто писать:

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

работает для меня, дайте мне знать :)

+0

Спасибо, это тоже работает, но я собираюсь использовать решение matthewrdev вместо этого, потому что мне нужно будет ввести меньше кода, если я собираюсь сделать больше тостов. – AlGrande

+0

@AlGrande Я просто хотел предложить другое решение, спасибо за комментарий :) –

 Смежные вопросы

  • Нет связанных вопросов^_^