Das Hinzufügen von etwas mehr Geschmack für diese Antwort, da dies auch zu Verwirrung führte. Sie sollten in der Lage sein, diesen Test in jeden @RunWith(AndroidJUnit4.class)
Test Ihres Projekts einzufügen (Sie müssen die Dimensionen auch zu Ihrer dimension.xml hinzufügen).
Hinweis: Alle diese Tests bestehen
@Test public void testScaledFontSizes() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
final Context context = InstrumentationRegistry.getTargetContext();
Configuration configuration = context.getResources().getConfiguration();
configuration.fontScale = 2.0f;
configuration.densityDpi = 160; // mdpi, 1:1
context.getResources().updateConfiguration(configuration, null);
float scaledTextSize = context.getResources().getDimensionPixelSize(R.dimen.sp_15);
assertEquals(30.0f, scaledTextSize);
// Create a new TextView with the explicitly set configuration
TextView textView = new TextView(context);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, scaledTextSize);
// 30, because font size is scaled
assertEquals(30.0f, textView.getTextSize());
// This is what we *don't* want, it's scaled *twice*!
textView.setTextSize(scaledTextSize);
assertEquals(60.0f, textView.getTextSize());
// DP instead of SP tests
float fifteenDp = context.getResources().getDimensionPixelSize(R.dimen.dp_15);
assertEquals(15.0f, fifteenDp);
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, fifteenDp);
// Still 15, because it's DP, not SP
assertEquals(15.0f, fifteenDp);
textView.setTextSize(fifteenDp);
// 30, because setTextSize DOES font scaling
assertEquals(30.0f, textView.getTextSize());
}
}
Der große Vorteil, den ich gefunden habe, ist, dass TextView.setTextSize(float)
die Schriftartenskalierung angewendet wird. Wenn Sie also ein Maß übergeben, das bereits als SP anstelle von DP gekennzeichnet ist, erhält es die Schriftartenskalierung zweimal .