我正在设置一个基本的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)
可能是什么问题?
答案 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>
这将不允许首先旋转,因此您的片段永远不会被销毁。如果你愿意的话,你当然可以把它描述为风景。