不幸的是,在Android

时间:2016-03-27 08:43:40

标签: android xml android-layout landscape

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

如果我在/ layout-land文件中没有更改复制的.xml中的任何内容,则在旋转时它会完全正常运行。

  

activity.xml

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

    <TextView
        android:id="@+id/question_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/true_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/true_button"/>

        <Button
            android:id="@+id/false_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/false_button"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

        <Button
            android:id="@+id/prev_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prev_button"/>

        <Button
            android:id="@+id/next_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            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_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    >

    <TextView
        android:id="@+id/question_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="24dp" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/true_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/true_button"/>

        <Button
            android:id="@+id/false_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/false_button"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

        <Button
            android:id="@+id/prev_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/prev_button"/>

    </LinearLayout>



</LinearLayout>

Logcat

FATAL EXCEPTION: main
                                                                             Process: com.bignerdranch.android.geoquiz, PID: 5727
                                                                             java.lang.RuntimeException: Unable to start activity ComponentInfo{com.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)

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

1 个答案:

答案 0 :(得分:0)

您可以使显示的不同布局文件不同,但如果您对不存在的视图(例如下一个按钮)使用findViewById,那么您将得到一个当你去调用该视图上的任何方法时,NullPointerException(例如,在你的错误的情况下分配它的点击监听器)。

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