簡體   English   中英

即使應用程序在Landscape中被鎖定,Android也會在縱向文件夾中查找資源

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM