【问题标题】:Xamarin Toast Message error (C#)Xamarin Toast 消息错误 (C#)
【发布时间】:2016-03-28 14:51:19
【问题描述】:

我想显示一条 toast 消息。如果我在 onCreate() 中执行此操作,它会正常工作。但我想这样做,我得到一个错误:

Java.Lang.NullPointerException:尝试调用虚拟方法 'android.content.res.Resources android.content.Context.getResources()' 在空对象引用上

我该怎么办?

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

【问题讨论】:

  • 我会看到的是,如果“this”或“this”中的 toast 消息试图显示在上面的视图在您尝试显示 toast 的上下文中为 null消息。
  • 我建议只使用创建 Fragment 的 Activity。您可以在 onAttach() 方法中使用 getActivity() 以确保它是正确的引用。

标签: c# android xamarin toast android-toast


【解决方案1】:

Java.Lang.NullPointerException 被触发是因为您手动创建和使用了MainActivity 的实例。

不要使用MainActivity 的自定义实例在Click 中显示您的toast 消息,而是简化您的代码以使用片段现有活动参考:

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 的实例。

见:

【讨论】:

    【解决方案2】:

    如果我理解正确你的问题,我认为一个好的解决方案可能是这个:

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

    当你在你拥有的每个片段中使用它时,你可以称之为写作:

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

    为我工作,让我知道 :)

    【讨论】:

    • 谢谢,这也可以,但我将改用 matthewrdev 的解决方案,因为如果我要制作更多的 toast 消息,我需要输入更少的代码。
    • @AlGrande 我只是想提供一个不同的解决方案,感谢您的评论:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2011-02-16
    相关资源
    最近更新 更多