【问题标题】:Android: onRetainNonConfigurationInstance() and orientation changes with different layoutsAndroid:onRetainNonConfigurationInstance() 和不同布局的方向变化
【发布时间】:2011-06-16 19:18:46
【问题描述】:

我有一个 Activity,它应该有两种完全不同的布局,具体取决于用户是以横向还是纵向模式持有它。

在onRetainNonConfigurationInstance()中,我存储了很多信息,如果存在的话,将其提取到onCreate()中,以恢复用户数据。

我有一个方法可以确定手机当前是纵向还是横向模式——如果 getWindowManager().getDefaultDisplay().getWidth() 大于 getWindowManager().getDefaultDisplay().getHeight(),那么它是横向的。

在我的纵向布局 xml 文件中,我有一些横向布局 xml 文件中不存在的图像视图。在 onCreate() 中,我检查我们是否处于纵向,如果是,则初始化并修改它们。如果我们处于横向模式,我不会。

这一切都适用于从纵向切换到横向,但是当切换回纵向时,我只为纵向模式执行的代码给出了一个空指针异常 - 它找不到视图元素。

堆栈跟踪:

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 的一个非常强大的功能。

谢谢!

【问题讨论】:

  • 查看代码会有所帮助。堆栈跟踪似乎表明您的 PopUp.java 文件中的 onCreate 方法中的第 147 行发生了空异常。
  • "我有一种方法可以确定手机当前是处于纵向还是横向模式 - 如果 getWindowManager().getDefaultDisplay().getWidth() 大于 getWindowManager().getDefaultDisplay() .getHeight(),然后它是横向的。” -- 为什么不在Configuration 对象上使用orientation 字段?毕竟,Android 将使用它来确定要加载的布局。
  • 不要相信 isInPortrait() 。为什么不在 XML 中设置这些视图不可见?

标签: android android-layout screen-orientation


【解决方案1】:

您可以将纵向布局放在 res/layout-port 中,将横向版本的布局放在 res/layout-land 中,并将默认(我想是方形屏幕)放在 res/layout 中。系统会自动(并且可靠地)确定要使用的布局版本。你不这样做有什么原因吗?

【讨论】:

  • 这就是我正在做的事情,我正在使用 onRetainNonConfigurationInstance() 在方向更改期间保存用户数据。在 onCreate() 期间,我需要初始化/配置一些视图(间隔),它们仅存在于布局端口中。
  • 听起来您需要编写代码来测试 findViewById 是否返回 null,当您在横向模式下尝试查找仅纵向视图之一时,它将返回 null。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
相关资源
最近更新 更多