Android - 当设备改变方向时,布局土地中的布局 xml 未加载

Posted

技术标签:

【中文标题】Android - 当设备改变方向时,布局土地中的布局 xml 未加载【英文标题】:Android - Layout xml in layout-land is not loading when the device changes orientation 【发布时间】:2012-12-01 22:00:29 【问题描述】:

我正在为我的 CS 课程开发一个 android 项目,我需要在其中输入模拟坐标。我想为方向和纵向指定不同的布局文件。我的/res 文件夹中有一个layout 文件夹和一个layout-land 文件夹。 layout 文件夹中的 xml 文件和 layout-land 文件夹中的 xml 文件命名完全相同。我没有为此特定活动设置android:configChanges="orientation"android:screenOrientation="portrait" - 但是,我确实为其他活动设置了它。我也没有在这个活动中实现onConfigurationChanged

理论上,当方向随这些设置发生变化时,屏幕应该更改为layout-land 中指定的布局,对吗?

但是,事实并非如此。布局保持不变。

我试图通过给横向布局一个不同的布局 ID android:id="@+layout/activity_mock_coor_land",然后执行 setContentView(R.layout.activity_mock_coor_land)" 来强制它进行更改。

但是,这个堆栈跟踪给了我一个错误:

AndroidRuntime(13964): FATAL EXCEPTION: main
AndroidRuntime(13964): java.lang.RuntimeException: Unable to start activity ComponentInfocom.mixd.grounds.tour/com.mixd.grounds.tour.MockCoor: android.content.res.Resources$NotFoundException: Resource ID #0x7f030009 type #0x12 is not valid
AndroidRuntime(13964):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
AndroidRuntime(13964):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
AndroidRuntime(13964):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
AndroidRuntime(13964):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
AndroidRuntime(13964):  at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(13964):  at android.os.Looper.loop(Looper.java:123)
AndroidRuntime(13964):  at android.app.ActivityThread.main(ActivityThread.java:4627)
AndroidRuntime(13964):  at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(13964):  at java.lang.reflect.Method.invoke(Method.java:521)
AndroidRuntime(13964):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
AndroidRuntime(13964):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
AndroidRuntime(13964):  at dalvik.system.NativeStart.main(Native Method)
AndroidRuntime(13964): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f030009 type #0x12 is not valid
AndroidRuntime(13964):  at android.content.res.Resources.loadXmlResourceParser(Resources.java:1874)
AndroidRuntime(13964):  at android.content.res.Resources.getLayout(Resources.java:731)
AndroidRuntime(13964):  at android.view.LayoutInflater.inflate(LayoutInflater.java:318)
AndroidRuntime(13964):  at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
AndroidRuntime(13964):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:198)
AndroidRuntime(13964):  at android.app.Activity.setContentView(Activity.java:1647)
AndroidRuntime(13964):  at com.mixd.grounds.tour.MockCoor.onCreate(MockCoor.java:21)
AndroidRuntime(13964):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
AndroidRuntime(13964):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
AndroidRuntime(13964):  ... 11 more

我不太确定这意味着什么。在layout-land 中找不到我的布局吗?

谁能帮助解决这个问题?

编辑:清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mixd.grounds.tour" android:versionCode="1" android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <uses-library
        android:name="com.google.android.maps"
        android:required="true" />

    <activity
        android:name=".SplashScreen"
        android:label="@string/title_activity_main"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MapsActivity"
        android:configChanges="orientation|keyboardHidden"
        android:label="@string/title_activity_maps"
        android:theme="@android:style/Theme.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MainActivity"
        android:configChanges="keyboardHidden"
        android:label="@string/title_activity_main"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".Choice"
        android:label="@string/title_activity_choice"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MockCoor"
        android:label="@string/title_activity_mock_coor" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".MockActivity"
        android:label="@string/title_activity_mock"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".NextCoor"
        android:label="@string/title_activity_next_coor" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".HistoryButton"
        android:label="@string/title_activity_history_button" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
    <activity
        android:name=".DisplayHistory"
        android:label="@string/title_activity_display_history" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
        </intent-filter>
    </activity>
</application>

&lt;/manifest&gt;

【问题讨论】:

“理论上,当方向随着这些设置而改变时,屏幕应该改变为 layout-land 中指定的布局,对吗?”是的,但显然有些不对劲。请发布您的清单。 完成!本来想先放上去的。很抱歉! 【参考方案1】:

如果您要为布局文件使用新名称,则需要从头开始重建所有内容,这意味着您必须手动重新创建包括所有视图在内的所有内容。使用布局域时,您必须对所有内容保持相同的命名约定。如果您发布所有代码,我们可能会为您提供帮助,但绝对不要将土地文件与新命名的文件一起使用,因为您必须在配置更改时重新构建整个活动。

【讨论】:

我只重命名过一次就强制改变了。当我第一次尝试时,我将它们设置为完全相同的名称。每当我用方向改变测试它时,我就把它改回来了。 这两种布局有什么真正的区别吗? 并非如此。我调整了几个 TextView 和一个 Button 的位置,使它们都可见。最初,TextViews 会掩盖按钮。微小但必要的改变。我可以将方向限制为纵向,但我想允许使用物理键盘。 尝试在你的 onresume 中添加一个声明来检查你的方向并将其打印到你的 logcat。还有什么类型的设备正在测试 如何获得当前方向?这是 CS 部门给我的旧摩托罗拉 Droid。它运行 2.2.1。【参考方案2】:

确保您的设备中启用了“自动旋转”功能。 在我的设备(Galaxy Gio)中,我可以在通知窗口中启用它...

【讨论】:

以上是关于Android - 当设备改变方向时,布局土地中的布局 xml 未加载的主要内容,如果未能解决你的问题,请参考以下文章

当方向改变而不旋转布局时如何旋转按钮?

当项目具有动态高度时,如何根据设备方向创建动态颤动网格布局

改变方向时UILabel没有调整

Android中的屏幕方向,横向

当用户改变设备方向时,如何只旋转导航栏而不旋转视图?

使用方向更改视图布局