【问题标题】:Android - NullPointerException from creating an adapterAndroid - 创建适配器时出现 NullPointerException
【发布时间】:2015-02-09 16:27:39
【问题描述】:

我正在为列表视图创建一个数组适配器, 一切正常,我有 2 个片段,以及在这 2 个片段之间变化的操作栏顶部的 2 个按钮。 我的问题是,如果我在这些片段之间移动得太快,当我打开 fragOne,切换到 fragTwo,然后快速返回 fragOne 时,我会崩溃。。 fragOne 从 getActivity 上下文中抛出 NPE。

那是崩溃的那一行:

adapter = new MainFragmentDocumentAdapter(getActivity(), docsList, DocumentsFragment.this, page);

日志报告:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.bbb.app, PID: 17438
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference
        at android.widget.ArrayAdapter.init(ArrayAdapter.java:310)
        at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:104)
        at com.bbb.app.UI.adapters.MainFragmentDocumentAdapter.<init>(MainFragmentDocumentAdapter.java:51)

知道如何解决这个问题吗?

【问题讨论】:

  • 你会因为片段生命周期问题而崩溃,有时会导致 getActivity() 为空。
  • getApplicationContext() 不是最优的,因为它不会在适配器中设置任何样式。 ContextThemeWrapper 应用程序上下文与应用程序主题或使适配器成为全局对象,以便在片段恢复时不会尝试实例化另一个适配器并且您的应用程序不会崩溃。
  • jvrodrigues 谢谢你的回答,你能解释一下吗?完全没看懂,谢谢!
  • 用 getApplicationContext() 更改 getActivity() 我喜欢programming by permutation ...问题出在过早的getActivity() 调用中...好像你是从“constructor”(构造函数中的 fx 或作为字段初始化器)......类似的问题被问了很多次
  • 你在哪个方法中创建了适配器?如果片段在标签中,为什么每次切换标签时都需要重新创建它们?

标签: java android android-fragments


【解决方案1】:

所以基本上经过大量检查后,我发现问题在于我在另一个片段中返回该片段,因为我有一个侦听器指出那里并试图打开该方法。

基本上我只是把它包在一个

if (getActivity() != null) {
    // Code goes here.
}

问题解决了。

非常感谢大家的帮助!

【讨论】:

  • 你把这个放在哪里?我不能用这个包装返回语句。
  • 我遇到了类似的问题,我花了 2 天时间试图解决。感谢您花时间发布您的问题的解决方案。
  • 看到这个答案后,我遇到了同样的问题并摸不着头脑。我从今天早上的研究中发现,在任何时候,如果您的 getActivity() 或 getContext() 为空,则意味着您的代码中存在严重错误。就我而言,我尝试加载片段代码而不将其附加到基于标志完成的活动。也就是说,我确保只有当标志为真并且片段附加到活动时才会加载代码。现在好消息:问题解决了!编码快乐... :)
【解决方案2】:

如果您在 Fragment 上,请检查是否添加了 Fragment。

{
    ... 

    if (!this.isAdded()) { //this = current fragment
        return;
    }
    LocationManager locationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
    ...
}

【讨论】:

    【解决方案3】:

    你可以这样做。

    内部活动

    public static UsageRecommendationTabActivity getInstance() {
            return activityInstance;
        }
    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    activityInstance=this;
    }
    

    内部片段

     @Override
        public void onAttach(Activity activity) {
            // TODO Auto-generated method stub
            super.onAttach(activity);
            if (activity instanceof UsageRecommendationTabActivity)
                mParentActivity = (UsageRecommendationTabActivity) activity;
            if (mParentActivity == null)
                mParentActivity = UsageRecommendationTabActivity.getInstance();
        }
    

    然后调用你的适配器

    adapter = new MainFragmentDocumentAdapter(mParentActivity, docsList, DocumentsFragment.this, page);
    

    【讨论】:

    • 有趣的想法!会试一试
    【解决方案4】:

    添加对 getContext()!=null 的检查

    块前

    mAdapter = new SimpleHomeItemAdapter(getActivity(), mList);
    listview.setAdapter(mAdapter);
    

    例如:

    if (getActivity()!=null){
    
    mAdapter = new SimpleHomeItemAdapter(getActivity(), mList);
    listview.setAdapter(mAdapter);
    
    }
    

    【讨论】:

      【解决方案5】:

      使用 try catch 块, 它对我有用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-19
        • 2012-03-23
        • 1970-01-01
        相关资源
        最近更新 更多