2015-02-09 91 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); 

} 
相關問題