2015-04-27 39 views
0

我正在設置一個基本的ArrayAdapter。當我旋轉屏幕幾次時,我得到一個空指針異常。android-init arrayadapter,得到一個空指針異常

public void testListView(){   
    my_array_list.add("hello world 1"); 
    my_array_list.add("hello world 2"); 
    my_array_list.add("hello world 3"); 
//next line does the problem 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, my_array_list); 
    mListView.setAdapter(arrayAdapter); 
} 

這是我onCreateView()

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.developer_test_side, container, false); 
    ... 
    my_array_list = new ArrayList<>(); 
    mListView = (ListView) v.findViewById(R.id.my_listview); 
    testListView(); 
} 

這裏是logcat的輸出:

04-27 20:10:45.985 11813-11813/com.rivler.example E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.rivler.example, PID: 11813 
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:153) 
     at com.example.rivler.DeveloperTestSide.testListView(DeveloperTestSide.java:116) 
     at com.example.rivler.DeveloperTestSide$6.run(DeveloperTestSide.java:149) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5312) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 

可能是什麼問題呢?

+0

getActivity返回null,因爲您的方法在線程中調用,而不考慮片段被連接與否。 – njzk2

+2

可能重複[什麼是NullPointerException,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it ) –

回答

0

每次旋轉屏幕時都會重新創建保存片段的活動。 Fragment本身會自己重新創建並重新連接到Activity

調用getActivity()返回NULL,如果Fragment尚未連接或Activity本身不會重新創建(a.k.a我們還沒有達到onActivityCreated()生命週期方法)。此內容導致ArrayAdapter中的NullPointerException

要解決您的問題 - 只需在onAttach()方法中保存您的上下文並使用它。另一種選擇是永遠包調用getActivity()isAdded()這樣的:

if (isAdded()) { 
    // code that needs getActivity() 
} 
+0

不幸的是它仍然發生在我身上,即使我檢查片段是否被添加。 – gphilip

0

這聽起來像視圖被破壞,代碼仍然試圖訪問現在不存在的組件(我猜是getActivity()返回null)。屏幕方向的變化會導致視圖被破壞。

嘗試將邏輯移入onResume。

0

如果你不需要或不想要這個活動屏幕旋轉,那麼你可以添加以下到您的清單。

<activity 
     android:name=".MainActivity" 
     android:screenOrientation="portrait"> 
</activity> 

這將不允許在第一個位置的旋轉,因此您的片段將永遠不會被銷燬。如果你願意的話,你當然可以說它是風景。