我对Android开发和上下文的想法很新。因此,如果看起来我显然做错了,请解释我应该做的事情。
我正在尝试将我的应用程序上下文传递给构造函数(以便我可以访问该对象中的数据库表)但我仍然遇到以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext on a null object reference
这是我的代码片段:
public class FragmentShoppingList extends Fragment{
MyApplication myApplication = new MyApplication();
public FragmentShoppingList() {
}
SQLiteShoppingCartService sqLiteShoppingCartService = new SQLiteShoppingCartService(getActivity().getApplicationContext());
}
为什么getActivity()
返回空引用?
片段可以独立于它所托管的activity
而存在。请参阅fragment lifecycle。创建片段实例时,代码会初始化您的sqLiteShoppingCartService
。创建实例时,片段不是任何活动的一部分。它后来附加到活动。使用onActivityCreated生命周期方法初始化您的sqLiteShoppingCartService
。
在Android Fragment的生命周期中有一个名为onAttach(Context context)的方法
SQLiteShoppingCartService sqLiteShoppingCartService = new SQLiteShoppingCartService(getActivity().getApplicationContext());
在创建FragmentShoppingList的对象时调用上面的这一行。只有当片段附加到窗口并且在onAttach(Context context)方法上发生时,才会在这种情况下将Fragment赋予片段FragmentShoppingList的对象。
MyApplication myApplication = new MyApplication();
我相信MyApplication从Application扩展,如果是这样,就不要像这样创建。一旦您在Android.Manifest文件中引用它,它就是每个Android应用程序的入口点。
尝试使用getActivity()
。
而不是getActivity().getApplicationContext()
。