Android:我自己处理方向变化-RelativeLayout 变得一团糟

发布于 2024-10-11 12:52:08 字数 4033 浏览 4 评论 0原文

在 Android 应用程序中,我有一个有点复杂的活动,并且可能在某些时间运行线程,完成后将更新 UI。因此,在这些线程之一的中间让 Activity 销毁并再次创建(由于方向更改)可能会导致用户必须重新尝试该操作,这很糟糕。

因此,我决定通过在清单中添加 android:configChanges="orientation|keyboardHidden" 来自己处理方向更改,然后可以覆盖 Activity.onConfigurationChanged(Configuration newConfig)< /代码> 方法。

此活动的根布局是RelativeLayout。 目前,除了调用 super() 之外,我实际上没有在 onConfigurationChanged() 中执行任何操作。

方向更改后,布局变得混乱 - 一些 android:layout_above= 的元素要么位于屏幕底部,要么漂浮在它们应该漂浮的上方。

有人对如何解决这个问题有任何想法吗?

我知道,如果我允许活动在方向更改时重新启动,它将使用 res/layout-land/ 中的布局,但重新启动活动似乎确实是错误的方式。

编辑:

我尝试 setContentView(R.layout.displaymap);在 onConfigurationChanged() 方法中并得到以下错误:

I/WindowManager(  571): onOrientationChanged, rotation changed to 1
D/StatusBar(  571): updateResources
E/AndroidRuntime( 3813): android.view.InflateException: Binary XML file line #17: Error inflating class java.lang.reflect.Constructor
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.createView(LayoutInflater.java:512)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:564)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.rInflate(LayoutInflater.java:620)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
E/AndroidRuntime( 3813):        at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309)
E/AndroidRuntime( 3813):        at android.app.Activity.setContentView(Activity.java:1626)
E/AndroidRuntime( 3813):        at com.apps.virtualtravel.DisplayMap.onConfigurationChanged(DisplayMap.java:1065)
E/AndroidRuntime( 3813):        at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:3383)
E/AndroidRuntime( 3813):        at android.app.ActivityThread.handleConfigurationChanged(ActivityThread.java:3449)
E/AndroidRuntime( 3813):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1762)
E/AndroidRuntime( 3813):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3813):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 3813):        at android.app.ActivityThread.main(ActivityThread.java:3948)
E/AndroidRuntime( 3813):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3813):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 3813):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
E/AndroidRuntime( 3813):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
E/AndroidRuntime( 3813):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 3813): Caused by: java.lang.reflect.InvocationTargetException
E/AndroidRuntime( 3813):        at com.google.android.maps.MapView.<init>(MapView.java:237)
E/AndroidRuntime( 3813):        at java.lang.reflect.Constructor.constructNative(Native Method)
E/AndroidRuntime( 3813):        at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.createView(LayoutInflater.java:499)
E/AndroidRuntime( 3813):        ... 20 more
E/AndroidRuntime( 3813): Caused by: java.lang.IllegalStateException: You are only allowed to have a single MapView in a MapActivity
E/AndroidRuntime( 3813):        at com.google.android.maps.MapActivity.setupMapView(MapActivity.java:180)
E/AndroidRuntime( 3813):        at com.google.android.maps.MapView.<init>(MapView.java:279)
E/AndroidRuntime( 3813):        at com.google.android.maps.MapView.<init>(MapView.java:254)
E/AndroidRuntime( 3813):        ... 24 more

In an Android app, I've got an activity that is somewhat complex and may have threads running at certain times which, when finished, will update the UI. As such, having the Activity destroy and create again (due to orientation change) in the middle of one of these threads could lead to the user having to re-try that action, which is bad.

As such, I've decided to handle orientation changes myself by having android:configChanges="orientation|keyboardHidden" in the manifest, and can then override the Activity.onConfigurationChanged(Configuration newConfig) method.

The root layout for this activity is a RelativeLayout.
Currently, I don't actually do anything in onConfigurationChanged() other than call the super().

After an orientation change, the layout is muddled - some elements which are android:layout_above= are either at the bottom of the screen, or floating way above what they should be floating above.

Does anyone have any ideas as to how to fix this?

I'm aware that if I allowed the activity to restart upon an orientation change, it would then use a layout from res/layout-land/, but restarting the activity really seems to be the wrong way to go here.

Edit:

I've tried to setContentView(R.layout.displaymap); in the onConfigurationChanged() method and get the following error:

I/WindowManager(  571): onOrientationChanged, rotation changed to 1
D/StatusBar(  571): updateResources
E/AndroidRuntime( 3813): android.view.InflateException: Binary XML file line #17: Error inflating class java.lang.reflect.Constructor
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.createView(LayoutInflater.java:512)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:564)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.rInflate(LayoutInflater.java:620)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
E/AndroidRuntime( 3813):        at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:309)
E/AndroidRuntime( 3813):        at android.app.Activity.setContentView(Activity.java:1626)
E/AndroidRuntime( 3813):        at com.apps.virtualtravel.DisplayMap.onConfigurationChanged(DisplayMap.java:1065)
E/AndroidRuntime( 3813):        at android.app.ActivityThread.performConfigurationChanged(ActivityThread.java:3383)
E/AndroidRuntime( 3813):        at android.app.ActivityThread.handleConfigurationChanged(ActivityThread.java:3449)
E/AndroidRuntime( 3813):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1762)
E/AndroidRuntime( 3813):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 3813):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 3813):        at android.app.ActivityThread.main(ActivityThread.java:3948)
E/AndroidRuntime( 3813):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3813):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 3813):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:782)
E/AndroidRuntime( 3813):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:540)
E/AndroidRuntime( 3813):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 3813): Caused by: java.lang.reflect.InvocationTargetException
E/AndroidRuntime( 3813):        at com.google.android.maps.MapView.<init>(MapView.java:237)
E/AndroidRuntime( 3813):        at java.lang.reflect.Constructor.constructNative(Native Method)
E/AndroidRuntime( 3813):        at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
E/AndroidRuntime( 3813):        at android.view.LayoutInflater.createView(LayoutInflater.java:499)
E/AndroidRuntime( 3813):        ... 20 more
E/AndroidRuntime( 3813): Caused by: java.lang.IllegalStateException: You are only allowed to have a single MapView in a MapActivity
E/AndroidRuntime( 3813):        at com.google.android.maps.MapActivity.setupMapView(MapActivity.java:180)
E/AndroidRuntime( 3813):        at com.google.android.maps.MapView.<init>(MapView.java:279)
E/AndroidRuntime( 3813):        at com.google.android.maps.MapView.<init>(MapView.java:254)
E/AndroidRuntime( 3813):        ... 24 more

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

傲世九天 2024-10-18 12:52:08

如果您想设置为横向,则必须为横向模式创建布局,并将布局放在与纵向相同名称的layout-land文件夹中,而不是在onConfigChanged方法中的setContentview(R.layout.name)中。这将提供所需的 UI。否则您将在relativelayout 中遇到问题。

You have to create layout for landscape mode if you want to set for landscape and put the layout in layout-land folder with same name which is for portrait and than setContentview(R.layout.name) in onConfigChanged method. this will give the desired UI.other wise you will face issue in RelativeLayout.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文