即使应用程序在Landscape中被锁定,Android也会在纵向文件夹中查找资源

时间:2014-07-15 06:36:51

标签: android android-layout

我面临一个奇怪的问题。我的应用程序被锁定在景观上。我的应用程序是支持7英寸以上的平板电脑应用程序。所以我在res文件夹下创建了两个文件夹 - layout-sw600dp-land& layout-sw720dp-land和我把我所有的布局资源放在它下面。旋转屏幕时看起来很好,按预期工作。但是当我旋转我的屏幕并按下主页按钮时,android会在纵向文件夹中查找资源和应用程序崩溃,因为纵向文件夹中没有资源。为什么android会查看纵向文件夹,即使我在清单中提到应用程序方向是横向的。请参阅下面的代码。我做错了吗?

   android:name="com.example.activities.fragmentActivity"
    android:configChanges="keyboardHidden|orientation|screenSize"
    android:screenOrientation="sensorLandscape" >
</activity>

我的文件夹结构如下:

res
layout
layout-sw600dp-land
layout-sw720dp-land

当我将资源放在布局文件夹中时,它会防止崩溃。所以很明显android正在寻找资源肖像文件夹。任何人都可以帮我解决这个问题。

  

栈跟踪

07-24 16:40:00.383: E/AndroidRuntime(16041): FATAL EXCEPTION: main
07-24 16:40:00.383: E/AndroidRuntime(16041): Process: com.sample.android, PID: 16041
07-24 16:40:00.383: E/AndroidRuntime(16041): android.content.res.Resources$NotFoundException: Resource ID #0x7f030003
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.content.res.Resources.getValue(Resources.java:1123)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2309)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.content.res.Resources.getLayout(Resources.java:939)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.view.LayoutInflater.inflate(LayoutInflater.java:395)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at com.sample.android.fragments.sampleFragment.onCreateView(sampleFragment.java:189)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1478)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:927)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1460)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:440)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.os.Handler.handleCallback(Handler.java:733)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.os.Handler.dispatchMessage(Handler.java:95)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.os.Looper.loop(Looper.java:136)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at android.app.ActivityThread.main(ActivityThread.java:5001)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at java.lang.reflect.Method.invokeNative(Native Method)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at java.lang.reflect.Method.invoke(Method.java:515)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
07-24 16:40:00.383: E/AndroidRuntime(16041):    at dalvik.system.NativeStart.main(Native Method)

8 个答案:

答案 0 :(得分:1)

我不相信在没有相应默认布局的情况下将布局(或任何其他资源)放在覆盖目录中。当然,如果你把一个字符串放在values-ll目录中并且values中没有相应的字符串,lint就会抱怨。

我的建议是将layout-sw600dp-land的内容移至layout

您通过其他方式限制支持的设备,对吧?

答案 1 :(得分:0)

尝试删除configChanges属性。

答案 2 :(得分:0)

尝试使用 android:screenOrientation =“landscape” ..

答案 3 :(得分:0)

清理项目尝试运行项目或从layout-sw600dp-land

创建layout-land文件夹副本

答案 4 :(得分:0)

由于您在横向模式下屏蔽了应用程序,因此只需查看-land布局即可看出Android的合法性。

但它不是那样的,我甚至不称这是一个bug,框架只是期望在某些场合找到默认值。我不知道为什么会这样。

我建议改变你的文件夹结构,如下所示:

layout (default = what you used to have in sw600dp-land)
layout-sw720dp (remove -land, not needed since you locked in landscape)

如果您添加了对智能手机的支持,只需将您的布局移至layout-sw600dp并使用智能手机的布局文件夹。

答案 5 :(得分:0)

尝试从清单中删除configChanges并在代码中处理它,因此在onConfigurationChanged方法中创建 if 以检查应用程序是横向还是纵向。

如果您的应用程序已锁定格局,则可以执行此操作:

@Override
    public void onConfigurationChanged(Configuration newConfig) {

        if (myActivity.isLandscape()) {


        }
   }

这会强制Android在横向模式下重建你的视图。

答案 6 :(得分:0)

前几天我面临类似的问题。

引发了这个问题,因为当您旋转设备时,它将用于onConfigurationChange方法。现在,如果您没有在该方法中管理所有资源,那么它将会崩溃。

你可以尝试一件事,只需更新你的下一行,

android:screenOrientation="sensorLandscape"

android:screenOrientation="landscape"

同时删除以下行:

android:configChanges="keyboardHidden|orientation|screenSize"

检查一下。

如果它仍然崩溃然后让我知道,我会深入检查你的问题,并会尝试解决它。​​

答案 7 :(得分:0)

using( SuppressChangeNotifications() ) { SomeString = "Fred"; SomeNumber = 2; } 仅适用于您的活动位于前端的情况。 Android希望您的活动能够在后台存在而不会崩溃,即使设备处于不同的方向也是如此。正如其他人所说的那样,不要使用不必要的资源限定符。