ユーザーが横向きモードと縦向きモードのどちらで保持しているかに応じて、2 つのかなり異なるレイアウトを持つアクティビティがあります。
onRetainNonConfigurationInstance() では、多くの情報を保存し、存在する場合は onCreate() で抽出して、ユーザー データを復元します。
電話が現在縦向きモードか横向きモードかを判断する方法があります。getWindowManager().getDefaultDisplay().getWidth() が getWindowManager().getDefaultDisplay().getHeight() より大きい場合は横向きです.
私の縦向きレイアウト xml ファイルには、横向きレイアウト xml ファイルには存在しない画像ビューがいくつかあります。onCreate() では、縦向きかどうかを確認し、縦向きであれば初期化して変更します。横向きモードの場合は、そうしません。
これは、縦向きから横向きへの切り替えにはすべて正常に機能しますが、縦向きに戻すと、縦向きモードでのみ実行されるコードで null ポインター例外が発生し、ビュー要素が見つかりません。
スタックトレース:
E/AndroidRuntime( 4800): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.apps.hyperview/com.apps.hyperview.PopUp}: java.lang.NullPointerException
E/AndroidRuntime( 4800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2268)
E/AndroidRuntime( 4800): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2284)
E/AndroidRuntime( 4800): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3278)
E/AndroidRuntime( 4800): at android.app.ActivityThread.access$1900(ActivityThread.java:112)
E/AndroidRuntime( 4800): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
E/AndroidRuntime( 4800): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 4800): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 4800): at android.app.ActivityThread.main(ActivityThread.java:3948)
E/AndroidRuntime( 4800): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 4800): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 4800): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
E/AndroidRuntime( 4800): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
E/AndroidRuntime( 4800): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 4800): Caused by: java.lang.NullPointerException
E/AndroidRuntime( 4800): at com.apps.hyperview.PopUp.onCreate(PopUp.java:147)
E/AndroidRuntime( 4800): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 4800): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2231)
私が間違っていることを知っている人はいますか?
ありがとう!!r3mo
編集:
問題を引き起こす Popup.java セクション:
// Check orientation. If we're in portrait...
if( isInPortrait() )
{
spacer_above = (ImageView) findViewById(R.id.image_display_popup_spacer_above);
spacer_above.setVisibility(View.INVISIBLE); // THIS IS CAUSING THE NULLPOINTER
spacer_below = (ImageView) findViewById(R.id.image_display_popup_spacer_below);
spacer_below.setVisibility(View.INVISIBLE);
}
else;
縦向きのレイアウト ファイルにはこれらの「スペーサー」が含まれていますが、横向きのバージョンには含まれていません。これは、onRetainNonConfigurationInstance() を使用するときに方向が変更され、さまざまなレイアウトが処理される方法ですか? ポートレートからランドスケープに移行するとコードはすべて正常に動作しますが、ポートレートに戻ると NullPointerException が発生します。
編集2:
isInPortrait() は正常に動作しているようですが、これを変更します。ビューを非表示にするだけではない理由は、レイアウトの構造がランドスケープで大きく異なるためです。明らかに、この横向きのレイアウトは正常に機能しています。縦向きから横向きに移動してから縦向きに戻すと、エラーが発生します。
すべての助けに感謝します!
編集3:
これを行う方法を変更して、layout-port/ と layout-land/ に同じレイアウト ファイルを配置し、横長の View.GONE で不要なビュー要素を作成しました。この問題について意見を求めることは確かに良いことです。ランドスケープとポートレートでまったく異なるレイアウトを使用できるのは、Android の非常に強力な機能のようです。
ありがとう!