繁体   English   中英

Android:onRetainNonConfigurationInstance()和方向随着不同的布局而改变

[英]Android: onRetainNonConfigurationInstance() and orientation changes with different layouts

我有一个活动,该活动应具有两种截然不同的布局,具体取决于用户是以横向还是纵向模式进行操作。

在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的一个非常强大的功能是能够具有完全不同的横向和纵向布局。

谢谢!

您可以将纵向布局放置在res / layout-port中,将布局的横向版本放置在res / layout-land中,并将默认设置(我想是方形屏幕)放置在res / layout中。 系统自动(可靠地)确定要使用的版式版本。 您是否有理由不这样做?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM