Check out these two
EditTexts. One is on an API 21 device, the other on an API 22 device.
See the difference? It's even more pronounced with "show layout bounds" enabled:
The height and vertical alignment of the
EditTextsare different! This was caused by a change in the background of
EditTextbetween v21 and v22 (diff).
This change can cause sadness if your
EditTextis vertically aligned with other
Views, such as this case in Trello:
The text should be aligned with the icons, yet clearly it's not. The screenshot above is from 5.0; any other version of Android looks perfectly fine.
This problem crops up even if you're using AppCompat. AppCompat usually defers to the system material styles on v21+, which is the source of the problem.
Both solutions I've come up with use resource qualifiers to handle API 21 in a special manner.
One possibility is to import your own
EditTextbackground assets for API 21. Unless your app is filled with vertically-aligned
EditTextsthis seems like more effort than it's worth, since precision-targeting the background of
EditTextsfor just a single API version is tricky.
The hackier (but easier) solution is to just define different margins or paddings based on the API level. For example, I found that they're ~6dp off, so you end up with resources like this:
<!-- values/dimens.xml --> <dimen name="edit_text_spacing">6dp</dimen> <!-- values-v21/dimens.xml --> <dimen name="edit_text_spacing">0dp</dimen> <!-- values-v22/dimens.xml --> <dimen name="edit_text_spacing">6dp</dimen>
I'd be the first to admit it's ugly, but if there's only a handful of places you're fixing the problem, it's not so bad.