我面临一个奇怪的问题。我的应用程序被锁定在景观上。我的应用程序是支持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)
答案 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希望您的活动能够在后台存在而不会崩溃,即使设备处于不同的方向也是如此。正如其他人所说的那样,不要使用不必要的资源限定符。