Thursday, January 19, 2017

Android enums are out of fashion (again)

Back in 2011 Google removed from its Performance Tips the advice to avoid enums. Today I've been rewriting an older app and wanted to add a feature that allows you to change the EditTexts' size using a PreferenceFragmentCompat at runtime. It would have a low, medium and big setting and the sizes would be resolution independent. A low, medium and big trio is asking for an enum and apparently enums were already ok with Android SDK.

But then I decided yet to check this again. And it turns out that nowadays using an @IntDef is the kosher way of doing things.

So here is the final version of the function:

@Retention(SOURCE)
@IntDef({EDIT_SMALL, EDIT_MEDIUM, EDIT_LARGE})
public @interface EditSize {}
public static final int EDIT_SMALL = 12;
public static final int EDIT_MEDIUM = 24;
public static final int EDIT_LARGE = 38;


public static int getScaledPixels(Context context, @EditSize int dps) {
    final float scale = context.getResources().getDisplayMetrics().density;
    return (int) (dps * scale + 0.5f);
}