有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    您的例外情况是,您试图在null object reference上使用setLayoutManager。这意味着您的recylcerView此时为空。我看不到你的全部代码,所以我不能给你一个即时的解决方案。我能告诉你的是,每次改变屏幕方向时,你当前的活动都会被破坏并再次调用。因此,onCreate将再次被调用,而其他所有像您刚刚开始的Activity都将被调用。有时这里会发生问题,因此在如何处理这些事件上几乎没有选择


    在配置更改期间保留对象

    这意味着,当屏幕旋转时,您需要保留数据。这可以通过Bundle完成,但是如果您有一个大的数据集,那么最好使用ViewModel对象。如何在此处执行此检查:


    自己处理配置更改

    另一个选项带有大的警告。当你真的需要避免因为配置改变而重新启动时,把它当作最后的手段。这会阻止您的活动重新启动。如果您无法保存实例,我建议您这样做,但首先,请尝试使用ViewModel和捆绑包解决此问题

    如何做到这一点

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

    <activity/>标记内的AndroidManifest.xml中添加android:configChanges