一位朋友让我帮忙调试她的应用。该应用程序为许多类型的设备配置提供drawable。
在三星Galaxy Mini上,应用程序崩溃了,因为它无法找到任何匹配的资源。 (如果所有资源都复制到drawable
文件夹,则可以解决问题。)我想知道崩溃的原因。
res
文件夹的内容如下:
存储实际资源的仅位置为drawable-large-tvdpi
和drawable-normal-*
个文件夹。其余文件夹仅包含用于调试目的的测试图像(例如drawable-mdpi
包含带有文本“MDPI”的图片,因此应用程序可以使用它来检测当前设备搜索资源的位置)。显然,崩溃不是由于这些调试图像,而是因为应用程序无法找到应用程序XML引用的实际资源。
Galaxy Mini具有“小”屏幕和“ldpi”密度。我的猜测是,由于包含实际资源的文件夹都不是“小”屏幕大小(它们要么具有“普通”或“大”限定符),Android将找不到任何匹配的资源。 (请记住,并非所有文件夹都存储实际资源。)我应该如何重新组织所有内容以确保应用程序在任何设备上都不会崩溃?
(请注意,我当然读过相关官员Android doc。)
答案 0 :(得分:3)
好的,这有点令人困惑,但问题是(有点)在文档中阐明。具体做法是:
屏幕像素密度是未消除的一个限定符 矛盾。即使设备的屏幕密度是 因为每个屏幕都没有消除hdpi,drawable-port-ldpi / 密度被认为是匹配[首先]。
和
根据屏幕尺寸限定符选择资源时, 系统将使用专为小于的屏幕设计的资源 当前屏幕,如果没有更好的匹配资源(for 例如,如果是大尺寸屏幕将使用正常大小的屏幕资源 必要)。但是,如果唯一可用的资源大于 在当前屏幕上,系统不会使用它们和您的应用程序 如果没有其他资源匹配设备配置将崩溃(for 例如,如果所有布局资源都使用xlarge限定符标记, 但设备是正常尺寸的屏幕。)
因此,问题在于您为普通/大屏幕限定符提供了密度特定的资源(例如drawable-normal-ldpi
),但是没有提供小的(drawable-small-ldpi
)。