Will a density qualified drawable folder or drawable-nodpi take precedence?
I'm not sure what the precedence is for nodpi
, but that should never be a problem. It sounds like you are misunderstanding the nodpi
qualifier. You should not use nodpi
as a fallback for assets that you don't provide at the device's density bucket. The correct fallback is a folder with no density qualifier (e.g. drawable/
).
If the system cannot find an asset at the device's density (e.g. it is an ldpi device and you don't have a drawable-ldpi
folder), it will fall back to a folder without a density qualifier, *not the nodpi
qualifier`.
The nodpi
qualifier is used when you want to specify a resource that will be used for all densities and that you do not want Android to scale. Assets in the other density folders (e.g. drawable-xhdpi
) will be scaled to the actual screen size. If you use the nodpi
qualifier, you should not provide that asset in any other resource folders.
It is also important to note that with screen density qualifiers, Android will also prefer to use a lower density asset over an unqualified resource. If you have an xhdpi device, but you only have a drawable
and a drawable-mdpi
folder, Android will check for the asset in the mdpi folder before the unqualified folder.
It depends.
First of all nodpi
is not a fallback folder. If you have a hdpi device, the system will look for hdpi
folder first. nodpi
folder contains resources that are not meant to be scaled.
drawable/
can be used as a fallback folder in case device density specific resources are not present.
Then, if we look at the possible Qualifier Values for the Screen Pixel Density(dpi), these are listed as:
- ldpi
- mdpi
- hdpi
- xhdpi
- xxhdpi
- xxxhdpi
- nodpi (Non-scaling resources go here)
- tvdpi
- anydpi (Resources in this folder take highest precedence)
- nnndpi
Note: You should put all those resources in the drawable-nodpi
folder that you do not wish to be scaled. To support multiple screens, Android prefers to scale down a larger original image instead of scaling up a smaller original image. These resources should not be present in any other drawable-qualifier folder else these might be scaled which kind of defeats the whole purpose.
It must also be noted that:
Using a density qualifier does not imply that the resources are only for screens of that density. If you do not provide alternative resources with qualifiers that better match the current device configuration, the system may use whichever resources are the best match.
Here is the Resource Selection Flowchart that the system uses to find the best match:
drawable-nodpi will bypass scaling and drawable will use the default scaling:
drawable-nodpi is efficient if your code will be doing its own scaling (or no scaling) and you don't want the image pre-scaled by Android.
There is also drawable-anydpi, just to make things more confusing.
drawable with no specifications will be used if an exact match on density and screen specifications does not exist. drawable-nodpi will be used after drawable.
UPDATE If you have both drawable and drawble-nodpi, the select order is either a more complex rule not documented or Android is broken. Through experimentation I confirmed that devices with screen density < xhdpi will correctly select the drawable image. Devices with screen density >= xhdpi will select the drawable-nodpi.
Selection rule: 1. Pick match to screen density, one of these:
- drawable-ldpi
- drawable-mdpi
- drawable-hdpi
- drawable-xhdpi
- drawable-xxhdpi
- drawable-xxxhdpi
- If no match on density, then select one of these
- drawable (automatic scaling mdpi=none... xxxhdpi=4x)
- drawable-nodpi (no scaling)
- drawable-tvdpi
- drawable-anydpi (no scaling)