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 androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3352)
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5389)
at android.app.ActivityThread.access$1200(ActivityThread.java:223)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1803)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7231)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
***Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void androidx.recyclerview.widget.RecyclerView.setLayoutManager(androidx.recyclerview.widget.RecyclerView$LayoutManager)' on a null object reference***
***at com.example.explore_kpk.MainActivity.onCreate(MainActivity.java:121)
at android.app.Activity.performCreate(Activity.java:6877)***
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3209)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3352) 
at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:5389) 
at android.app.ActivityThread.access$1200(ActivityThread.java:223) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1803) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:158) 
at android.app.ActivityThread.main(ActivityThread.java:7231) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
I/Process: Sending signal. PID: 24892 SIG: 9

错误指向**的代码atcom.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);

您的例外是说您试图在null object reference上使用setLayoutManager。这意味着您的recylcerView目前为空。我没有看到你的全部代码,所以我不能给你一个即时的解决方案。我可以为你说的是,每次屏幕方向改变时,你当前的活动将被销毁并再次调用。所以,onCreate将被再次调用,其他的一切就像你刚刚开始新的Activity一样。有时这里会发生问题,所以如何处理这些事件的选项很少。


在配置更改期间保留对象

这意味着当屏幕旋转发生时,您可以保留数据。这可以用Bundle来完成,但是如果你有一个大的数据集,那么最好使用ViewModel对象。如何在这里检查:

  • 在配置更改期间保留对象| Android Developers
  • <
  • ViewModel指南/gh>
  • 关于SO的有用回答

自己处理配置更改

另一个选项带有大注意. 当您确实需要避免由于配置更改而重新启动时,请将此作为最后的手段。这将阻止您的活动重新启动。如果你不能保存你的实例,那么我建议你这样做,但首先,试着用ViewModel和Bundles来解决这个问题。

  • 自己处理配置更改| Documentation

怎么做?

<activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize|screenLayout" />

android:configChanges行添加到<activity/>标签中的AndroidManifest.xml

最新更新