【问题标题】:Android getApplicationContext() on a null object reference空对象引用上的 Android getApplicationContext()
【发布时间】:2019-04-06 03:17:51
【问题描述】:

我对 Android 开发和上下文概念非常陌生。因此,如果看起来我显然做错了事,请解释我应该怎么做。

我正在尝试将我的应用程序上下文传递给构造函数(以便我可以访问该对象中的数据库表),但我一直遇到以下错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.support.v4.app.FragmentActivity.getApplicationContext on a null object reference

这是我的代码的 sn-p:

public class FragmentShoppingList extends Fragment{

    MyApplication myApplication = new MyApplication();

    public FragmentShoppingList() {

    }

    SQLiteShoppingCartService sqLiteShoppingCartService = new SQLiteShoppingCartService(getActivity().getApplicationContext());
}

为什么getActivity() 返回一个空引用?

【问题讨论】:

  • 只要通过片段生命周期你就会得到它
  • 只写 getActivity() 也可以

标签: android android-context


【解决方案1】:

片段可以独立于它所在的activity 而存在。请参阅fragment lifecycle。创建片段实例时,代码会初始化您的sqLiteShoppingCartService。创建实例时,片段不是任何活动的一部分。它稍后会附加到活动中。 使用 onActivityCreated 生命周期方法来初始化您的 sqLiteShoppingCartService

【讨论】:

    【解决方案2】:

    在Android Fragment的生命周期中有一个方法叫onAttach(Context context)

    SQLiteShoppingCartService sqLiteShoppingCartService = new SQLiteShoppingCartService(getActivity().getApplicationContext());

    FragmentShoppingList 的 对象被创建时,上面这行代码会被调用。在这种情况下,FragmentShoppingList 的 对象只有在片段附加到窗口并且发生在 onAttach(Context context) 方法上时才会为片段提供上下文。

    MyApplication myApplication = new MyApplication();
    

    我相信 MyApplication 是从 Application 扩展而来的,如果是这样,请不要这样创建。一旦您在 Android.Manifest 文件中引用它,它就是每个 Android 应用程序的入口点。

    【讨论】:

      【解决方案3】:

      仅尝试使用getActivity()

      而不是getActivity().getApplicationContext()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-12
        • 1970-01-01
        • 2018-12-31
        • 1970-01-01
        • 2018-12-31
        • 2017-03-30
        • 2016-10-04
        相关资源
        最近更新 更多