[英]Android looking for resource in portrait folder even when the app is locked in Landscape
我面臨一個奇怪的問題。 我的應用程序被鎖定在景觀上。 我的應用程序是支持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)
我不相信在沒有相應的默認布局的情況下將布局(或任何其他資源)放在覆蓋目錄中。 當然,如果你把一個字符串棉絨抱怨values-ll
目錄並且在沒有相應的字符串values
。
我的建議是將layout-sw600dp-land
的內容移動到layout
。
您通過其他方式限制支持的設備,對吧?
嘗試刪除configChanges
屬性。
嘗試使用android:screenOrientation =“landscape” ..
清理項目嘗試運行項目或從layout-sw600dp-land創建layout-land文件夾副本
由於您在橫向模式下阻止了應用程序,因此只需查看-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並使用智能手機的布局文件夾。
嘗試從清單中刪除configChanges並在代碼中處理它,因此在onConfigurationChanged方法中創建一個if來檢查應用程序是橫向還是縱向。
如果您的應用程序鎖定在橫向中,則可以執行以下操作:
@Override
public void onConfigurationChanged(Configuration newConfig) {
if (myActivity.isLandscape()) {
}
}
這將迫使android在橫向模式下重建您的視圖。
前幾天我面臨類似的問題。
提出這個問題是因為當您旋轉設備時,它將用於onConfigurationChange方法。 現在,如果您沒有在該方法中管理所有資源,那么它將會崩潰。
你可以嘗試一件事,只需更新你的下面一行,
android:screenOrientation="sensorLandscape"
至
android:screenOrientation="landscape"
同時刪除以下行:
android:configChanges="keyboardHidden|orientation|screenSize"
檢查一下。
如果它仍然崩潰然后讓我知道,我將深入檢查你的問題,並將嘗試解決它。
screenOrientation
僅在您的活動位於前面時適用。 Android希望您的活動能夠在后台存在而不會崩潰,即使設備處於不同的方向也是如此。 正如其他人所說,不要使用不必要的資源限定符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.