java Android应用程序在更改方向时崩溃
当应用程序的方向发生变化时,请帮助我
W/ActionBarDrawerToggle: DrawerToggle may not show up because NavigationIcon is not visible. You may need to call actionbar.setDisplayHomeAsUpEnabled(true);
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.explore_kpk, PID: 24892
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.explore_kpk/com.example.explore_kpk.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void 安卓x.recyclerview.widget.RecyclerView.setLayoutManager(安卓x.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference
at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)
at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3352)
at 安卓.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5389)
at 安卓.app.ActivityThread.access$1200(ActivityThread.java:223)
at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1803)
at 安卓.os.Handler.dispatchMessage(Handler.java:102)
at 安卓.os.Looper.loop(Looper.java:158)
at 安卓.app.ActivityThread.main(ActivityThread.java:7231)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
***Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void 安卓x.recyclerview.widget.RecyclerView.setLayoutManager(安卓x.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference***
***at com.example.explore_kpk.MainActivity.onCreate(MainActivity.java:121)
at 安卓.app.Activity.performCreate(Activity.java:6877)***
at 安卓.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
at 安卓.app.ActivityThread.performLaunchActivity(ActivityThread.java:3209)
at 安卓.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3352)
at 安卓.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5389)
at 安卓.app.ActivityThread.access$1200(ActivityThread.java:223)
at 安卓.app.ActivityThread$H.handleMessage(ActivityThread.java:1803)
at 安卓.os.Handler.dispatchMessage(Handler.java:102)
at 安卓.os.Looper.loop(Looper.java:158)
at 安卓.app.ActivityThread.main(ActivityThread.java:7231)
at java.lang.reflect.Method.invoke(Native Method)
at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
I/Process: Sending signal. PID: 24892 SIG: 9
这是错误指向的代码**
在com.example.explore_kpk.MainActivity.onCreate(MainActivity.java:121)
RecyclerView recyclerView=(RecyclerView)findViewById(R.id.recyler_view);
RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(this, recyclerList);
long seed = System.nanoTime();
Collections.shuffle(recyclerList, new Random(seed));
GridLayoutManager gridLayoutManager=new GridLayoutManager(this, mNoOfColumns);
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.setAdapter(recyclerViewAdapter);
# 1 楼答案
您的例外情况是,您试图在
null object reference
上使用setLayoutManager
。这意味着您的recylcerView
此时为空。我看不到你的全部代码,所以我不能给你一个即时的解决方案。我能告诉你的是,每次改变屏幕方向时,你当前的活动都会被破坏并再次调用。因此,onCreate
将再次被调用,而其他所有像您刚刚开始的Activity
都将被调用。有时这里会发生问题,因此在如何处理这些事件上几乎没有选择在配置更改期间保留对象
这意味着,当屏幕旋转时,您需要保留数据。这可以通过Bundle完成,但是如果您有一个大的数据集,那么最好使用ViewModel对象。如何在此处执行此检查:
自己处理配置更改
另一个选项带有大的警告。当你真的需要避免因为配置改变而重新启动时,把它当作最后的手段。这会阻止您的活动重新启动。如果您无法保存实例,我建议您这样做,但首先,请尝试使用ViewModel和捆绑包解决此问题
如何做到这一点
在
<activity/>
标记内的AndroidManifest.xml
中添加android:configChanges
行