2015-02-09 89 views
17

我正在创建一个列表视图的阵列适配器, 一切工作正常,我有2个片段和2个按钮在这两个片段之间更改的操作栏的顶部。 我的问题是,我得到的崩溃,如果我操之过急那些断肢之间,当我打开fragOne,切换到fragTwo,然后迅速搬回fragOne .. fragOne抛出从getActivity上下文NPE ..Android - NullPointerException从创建适配器

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) 

任何想法我怎么能解决这个问题呢?

+4

你得到因片段周期的问题上崩溃的是有时会导致getActivity()为空。 – jvrodrigues 2015-02-09 16:30:51

+2

getApplicationContext()不是最优的,因为它不会在适配器内设置任何样式。 ContextTheme将应用程序上下文与应用程序主题一起打包,或者使适配器成为全局对象,以便在片段恢复时不会尝试实例化另一个适配器,并且您的应用程序不会崩溃。 – jvrodrigues 2015-02-09 16:34:10

+0

jvrodrigues谢谢你的回答,你能解释一下吗?我完全不明白,谢谢! – JozeRi 2015-02-09 16:39:37

回答

43

所以基本上经过大量的检查后,我发现问题在于我在不同片段内返回该片段,因为我有一个监听器指向那里并尝试打开该方法。

基本上我只是包裹在一个

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

和问题就解决了。

非常感谢所有帮助家伙!

+0

你把这个放在哪里?我无法用这个包装返回语句。 – grant 2016-12-20 18:07:51

+0

我有一个类似的问题,我花了2天试图解决。感谢您花时间将解决方案发布到您的问题。 – Nikaoto 2017-02-21 17:55:31

+0

请指明该代码的放置位置? – 2017-02-27 05:19:14

-1

使用try catch块, 它为我工作

1

你可以做到这样。

活动

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); 
+0

有趣的想法!会试一试 – JozeRi 2015-05-23 07:47:18

2

,如果你是一个片段检查,如果被添加的片段。 !

{ 
    ... 

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

添加检查的getContext()= NULL

之前块

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

例如:

if (getActivity()!=null){ 

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

} 
相关问题