android - init arrayadapter,获取nullpointer异常

时间:2015-04-27 18:37:10

标签: android listview nullpointerexception

我正在设置一个基本的ArrayAdapter。当我旋转屏幕几次,然后我得到一个nullpointer异常。

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)

可能是什么问题?

3 个答案:

答案 0 :(得分:0)

听起来视图正在被破坏,代码仍在尝试访问现在不存在的组件(我的猜测是getActivity()返回null)。屏幕方向更改将导致视图被破坏。

尝试将逻辑移动到onResume中。

答案 1 :(得分:0)

每次旋转屏幕时,都会重新创建保留片段的活动。 Fragment本身会自行重新创建并再次附加到Activity

如果getActivity()尚未附加,或Fragment本身未重新创建({名}我们尚未到达Activity,则调用onActivityCreated()会返回NULL生命周期方法)。这种情况会导致NullPointerException中的ArrayAdapter

要解决您的问题 - 只需在onAttach()方法中保存您的上下文并使用它即可。其他选项是始终将getActivity()的调用与isAdded()一起打包,如下所示:

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

答案 2 :(得分:0)

如果您不需要或希望在此活动上旋转屏幕,则可以将以下内容添加到清单中。

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

这将不允许首先旋转,因此您的片段永远不会被销毁。如果你愿意的话,你当然可以把它描述为风景。