不幸的是,在 Android 的 layout-land 文件中更改 .xml 时,应用程序已在物理设备上停止 [重复]

Posted

技术标签:

【中文标题】不幸的是,在 Android 的 layout-land 文件中更改 .xml 时,应用程序已在物理设备上停止 [重复]【英文标题】:Unfortunately, App has stopped on physical device when making changes to .xml in layout-land file in Android [duplicate] 【发布时间】:2016-03-27 08:43:40 【问题描述】:

在 Big Nerd Ranch 指南的第 3 章中,他们解释了如何以不同方式布局默认视图和横向视图。但是,当我创建一个横向方向的 android 资源目录,然后将相同的 .xml 从默认布局复制到 /layout-land 并对其进行更改时,当我旋转到横向模式时,应用程序在我的物理设备上崩溃。

如果我不更改 /layout-land 文件中复制的 .xml 中的任何内容,它在旋转时运行绝对正常。

activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:gravity="center"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/question_text_view"
        android:layout_
        android:layout_
        android:padding="24dp" />

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal">

        <Button
            android:id="@+id/true_button"
            android:layout_
            android:layout_
            android:text="@string/true_button"/>

        <Button
            android:id="@+id/false_button"
            android:layout_
            android:layout_
            android:text="@string/false_button"/>

    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        >

        <Button
            android:id="@+id/prev_button"
            android:layout_
            android:layout_
            android:text="@string/prev_button"/>

        <Button
            android:id="@+id/next_button"
            android:layout_
            android:layout_
            android:text="@string/next_button"/>
    </LinearLayout>



</LinearLayout>

/layout-land/activity.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:gravity="center"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/question_text_view"
        android:layout_
        android:layout_
        android:padding="24dp" />

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="horizontal">

        <Button
            android:id="@+id/true_button"
            android:layout_
            android:layout_
            android:text="@string/true_button"/>

        <Button
            android:id="@+id/false_button"
            android:layout_
            android:layout_
            android:text="@string/false_button"/>

    </LinearLayout>

    <LinearLayout
        android:layout_
        android:layout_
        >

        <Button
            android:id="@+id/prev_button"
            android:layout_
            android:layout_
            android:text="@string/prev_button"/>

    </LinearLayout>



</LinearLayout>

日志猫

FATAL EXCEPTION: main
                                                                             Process: com.bignerdranch.android.geoquiz, PID: 5727
                                                                             java.lang.RuntimeException: Unable to start activity ComponentInfocom.bignerdranch.android.geoquiz/com.bignerdranch.android.geoquiz.QuizActivity: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2695)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769)
                                                                                    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4378)
                                                                                    at android.app.ActivityThread.access$1000(ActivityThread.java:177)
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1436)
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                    at android.os.Looper.loop(Looper.java:135)
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5910)
                                                                                    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:1405)
                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200)
                                                                                 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                                                    at com.bignerdranch.android.geoquiz.QuizActivity.onCreate(QuizActivity.java:81)
                                                                                    at android.app.Activity.performCreate(Activity.java:6178)
                                                                                    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                                                                                    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2648)
                                                                                    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2769) 
                                                                                    at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4378) 
                                                                                    at android.app.ActivityThread.access$1000(ActivityThread.java:177) 
                                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1436) 
                                                                                    at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                                    at android.os.Looper.loop(Looper.java:135) 
                                                                                    at android.app.ActivityThread.main(ActivityThread.java:5910) 
                                                                                    at java.lang.reflect.Method.invoke(Native Method) 
                                                                                    at java.lang.reflect.Method.invoke(Method.java:372)

无法弄清楚是什么问题。请帮忙

【问题讨论】:

发布你的 logcat 或者你可能会自己从中弄清楚 我们无法弄清楚,直到您发布堆栈跟踪! 您的横向布局缺少next_button Button。如果您使用findViewById() 来获取对它的引用,它将返回null,并且在其上调用任何方法都会导致NullPointerException 当然,但您的代码也必须考虑不同的布局。如果在横向模式下没有next_button,您仍然不能尝试使用它。 其实没必要,因为我们已经发现了问题。 【参考方案1】:

你可以有不同的布局文件,看起来不同,但是如果你在不存在的视图上使用findViewById(比如下一个按钮),那么你会得到一个 NullPointerException您可以调用该视图上的任何方法(例如在出现错误的情况下为其分配点击侦听器)。

简单的解决方案是让两个布局中的所有视图都具有相同的 id,但只需根据方向重新排列它们。

【讨论】:

我已经做到了,正如你所看到的,两个 .xml 文件中的所有视图都具有相同的 ID。 您可能需要再次仔细检查您在问题中发布的内容。下一个按钮肯定不见了

以上是关于不幸的是,在 Android 的 layout-land 文件中更改 .xml 时,应用程序已在物理设备上停止 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义ArrayAdapter:滚动时“不幸的是,应用程序已停止”

Eclipse 中的 Android 项目,不幸的是“appName”已停止

Android 应用程序错误 - 不幸的是,您的应用程序已停止

出现错误:-不幸的是,应用程序已在 android 中停止

不幸的是,“应用程序”已经停止了 Android Studio 的问题

GCM Android:不幸的是,GCM 演示已停止