Search code examples
androidtextviewdensity-independent-pixelscreen-density

Same text size but it larger on other devices


I have a TextView in which I programmatically setup the text size in 'SP'.

tv.setTextSize(spToPx(5, context));

public static int spToPx(float sp, Context context) {
    return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp, context.getResources().getDisplayMetrics());
}

First screenshot shows how it should look (and how it looks on my Xiaomi Redmi and Doogee HT7

First screenshot shows how it should look (and how it looks on my Xiaomi Redmi and Doogee HT7)

Second screenshot shows how it looks on other devices with higher or the same dpi.

Second screenshot shows how it looks on other devices with higher or the same dpi.

Normally, if I understand correct, text with the same size in 'dp' or 'sp' should looks the same on other devices (with the same screen size) because it automatically converts 'dp' or 'sp' to the needed amount of pixels depending on dpi.

After reading Android Developer Guideline about devices with different density I was expecting that text would be smaller if I use the same text size on devices with higher dpi. But now I have a situation that I really don't understand.


Solution

  • I still didn't find right explanation to this issue. The only theory I have is next:

    There are density buckets (120 dpi, 160 dpi, 240 dpi, 320 dpi, 480 dpi, 640 dpi). Screen density of your device will be determinated as the closest bucket. For example, if your device has 401 dpi it will be counted as 480 dpi. So, when I create and add view with size of 20 dp it will convert into more pixels than needed. It the hardest for devices that have density right between two buckets. I also checked density of all devices that had wrong image display (like on image 2) and it was almost right between two buckets...

    I still don't know why this happens only when I create and add view dynamycally, but the only way to solve this problem was the creating of separate layout with all presetted views instead of adding these views dynamically.