2013-10-19 155 views
0

我創建了一個帶有圖像的應用程序,並且我通過Android Icon Set嚮導添加了它們。該向導爲圖像創建了3個版本 - mdpi,hdpi,xhdpi。帶有ldpi屏幕的設備上的應用程序崩潰

我在google play上發佈了我的應用程序,並且我收到了來自具有ldpi屏幕的用戶的崩潰報告。例外是Caused by: android.content.res.Resources$NotFoundException: File from drawable resource ID #0x7f02007f。 drawable存在於mdpi,hdpi和xhdpi中,並且該應用程序可以處理其他用戶。

所以我想問題是可繪製的劑量不存在於它的ldpi版本。

所以我的問題是:
1)有什麼辦法可以說應用程序自動縮放mdpi drawables而不是崩潰嗎?
2)爲了支持ldpi屏幕,我必須將圖像編輯爲ldpi大小嗎?

謝謝。

+0

當你可能已經定義了一種屏幕大小的佈局並錯過了爲ldpi的定義它時,你會得到一個資源未找到 –

回答

1

這是不同密度管理的常見錯誤,所以這些就是你的問題的答案。

1.-不,您的資產的存儲方式是,「只有當您的資產處於當前密度的較低層級時」,例如:如果您的資產是可繪製的(默認非特定密度),並且drawable-ldpi並且您在中密度設備中運行應用程序,操作系統將嘗試將-ldpi中的圖像調整爲您的密度(如果在圖像中使用dps但會花費內存)。操作系統處理資產的方式如下:

比方說你有:

res- 
    -drawable 
     -icon.png 
    -drawable-ldpi 
     -icon.png 
    -drawable-mdpi 
     -icon.png 

如果你是在一個高密度的設備上運行的應用程序的操作系統首先將嘗試找到drawable-您的資產hdpi,但由於它不存在,它將開始向下層次直到它找到它,所以在這種情況下,它不會在drawable-hdpi中找到它,但會在drawable-mdpi中找到它,並將使用它來填充,一切都會好起來的,但是會記住資產密度的不同。

現在你有確切的錯誤來玩當操作系統出現故障的資產文件夾層次結構,去到最後,不找到,例如什麼:

比方說你有:

res- 
    -drawable-hdpi 
     -icon.png 

如果你運行這個應用程序,在高Desnity設備它將運行完美,因爲會發現資產在第一次嘗試,並永遠不會下來的層次結構,同樣的情況超高密度設備,因爲如果它沒有找到它在drawable-xhdpi它會在下一步找到它時,沿着層次結構繪製hdpi並且工作得很好,但是對於中等密度,首先它會嘗試在drawable-mdpi中找到它,因爲它不在那裏,會下降並嘗試在drawable-ldpi中找到它,因此它將轉到「default(drawable)」,這是一個很好的做法平均大小的所有資產至少使應用程序看起來比崩潰模糊,因爲操作系統將無法找到資產或BOOOM沒有資源找到,那麼你有你的例外,這種機制幾乎適用於Android的任何資源

2.-是的,您必須在ldpi中創建您的資產,並將它們存儲在drawable-ldpi或drawable(默認 - 無密度)中,以使其看起來不錯。

所有這些信息都是從書中提取出來的,如果您仍然有疑問,請在Eclipse中創建一個空的Android項目,並注意SDK如何在每個密度中創建一個具有特定大小的icon_launcher.png img以正確處理問題。根據我的經驗,我發現我始終都很注重所有密度,但更重要的是將所有資產的平均密度/質量都放在默認文件夾中,以避免出現這種確切問題,以防您可能在過程中忘記一個密度發展,比崩潰更好地模糊資產。

希望這有助於。

問候!

+1

您不需要爲所有DPI設置可繪製的大小。如果你只有一個可繪製的,Android將簡單地升級或縮減它們。 –

+0

haha​​ha,這是一個糟糕的做法,如果你不相信我,試試看,但是監視HEAP,因爲android會嘗試調整這些圖像的大小,這將花費大量的內存,OutOfMemoryErrors將會全部拋出這個地方。我在這裏經驗豐富,我曾經做過幾年前剛剛開始使用Android時說的話,這讓我看起來非常糟糕:P –

+1

使用可繪製文件夾的首要目的是存儲應用程序圖標和其他小圖片。如果由於Android的(有效)縮放這些圖像而導致出現OutOfMemory錯誤,那麼您就錯了。簡單地提供drawable的xhdpi版本絕對沒有錯,並讓系統進行縮放。如果你需要像素完美,你應該始終做自我縮放,並可能在較低的DPI設備上進行更改,但除此之外沒有意義。是的,我也有這方面的經驗,好友,並且在這裏沒有OutOfMemory錯誤。 –

-1

有沒有辦法對應用程序自動縮放mdpi drawable而不是崩潰?

這種情況會自動發生,除非固件製造商(設備製造商或ROM modder)將其固定。

對於支持ldpi屏幕,我必須編輯圖像到ldpi大小嗎?

號我會查找與您的生產代碼庫相關聯的R.java7f02007f,並確保它是什麼,你認爲它是。請記住,每次編譯都會重新生成這些數字。也許這是一個在任何密度下都沒有這個數字的可繪製資源的情況,因爲R.java與實際資源封裝不同步。爲了避免這個問題,作爲製作生產APK的一部分,做一個乾淨的構建(例如,Eclipse中的Project> Clean)。

+0

R.java中的代碼存在,但ldpi屏幕中的應用程序崩潰。它發生在不是原始的ROM上嗎?我能用它做什麼? – nrofis

+0

@nrofis:「它發生在不是原始的ROM?」 - 我不知道哪些設備正在爲您崩潰,所以我無法回答。 「我能用它做什麼?」 - 或者提供'-ldpi' drawables,或者在清單中使用''來阻止分發到'-ldpi'設備,或者試圖找出這個問題是否影響所有'-ldpi'設備,或者只有那些運行某些特定ROM模組的人。 – CommonsWare

+0

這應該是被接受的答案。如果你有這樣的錯誤,那不是因爲你沒有提供你的drawable的ldpi版本,這幾乎肯定是因爲你的R.java文件存在問題。正如CommonsWare所建議的那樣,清理項目應該修復它。 –

相關問題