2016-03-27 17 views
0

Big Nerd Ranchガイドの第3章では、デフォルトビューとランドスケープビューのレイアウトを変更する方法について説明します。しかし、横向きのAndroidリソースディレクトリを作成し、デフォルトのレイアウトから/ layout-landに同じ.xmlをコピーして後者に変更すると、ランドスケープモードに切り替えると物理デバイスでアプリがクラッシュします。残念ながら、Androidのレイアウトファイルで.xmlを変更すると物理デバイスでアプリケーションが停止しました

/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) 

問題の原因を特定できません。あなたは異なって見える異なるレイアウトファイルを持つことができます

+0

あなたのlogcatを投稿するか、おそらくそれから自分自身を知ることができるでしょう –

+1

stacktraceを投稿するまでわからないことがあります! –

+0

あなたのランドスケープレイアウトに 'next_button'' Button'がありません。 'findViewById()'を使って参照を取得している場合、nullを返し、その上の任意のメソッドを呼び出すと 'NullPointerException'が返されます。 –

答えて

0

を助けるが、あなたは(たとえば、次のボタンなど)が存在しないビューにfindViewByIdを使用している場合は、あなたが呼び出すために行くとき、あなたはNullPointerExceptionが得られますしてくださいそのビュー上の任意のメソッド(エラーの場合はクリックリスナーを割り当てるなど)

単純な解決策は、両方のレイアウトのすべてのビューを同じIDで保持し、向きに応じて再配置することです。

+0

ご覧のとおり、両方の.xmlファイルのすべてのビューに同じIDがあります。 – Chaki

+0

質問に投稿した内容を慎重に確認したい場合があります。次のボタンは間違いなく欠けています –

関連する問題