26

这个问题与Android App有关:如何在设置下阅读字体大小?我阅读了CommonsWare的答案,指出要使用Settings.System.FONT_SCALE。所以我写了这几行:

float scale = -66.6f;
try {
    scale = android.provider.Settings.System.getFloat(getContentResolver(),
                                    android.provider.Settings.System.FONT_SCALE);
} catch(SettingNotFoundException e) {
    Log.e(getClass().getSimpleName(), "Error: ", e);
}
Toast.makeText(this, "scale=" + scale, Toast.LENGTH_LONG).show();

我的问题是我总是得到SettingNotFoundException我正在使用 Android 4.2.2 设备。顺便说一句,我的代码在onCreate一个Activity.

我还用谷歌搜索了这个问题,发现大约 3 个使用相同代码的网站。是否需要一些特殊许可?我也尝试了许可android.permission.WRITE_SETTINGS但没有成功。

4

4 回答 4

55

我刚刚在Settings.System这个函数的源代码中发现:

/** @hide */
public static void getConfigurationForUser(ContentResolver cr,
                                       Configuration outConfig, int userHandle) {
    outConfig.fontScale = Settings.System.getFloatForUser(
        cr, FONT_SCALE, outConfig.fontScale, userHandle);
    if (outConfig.fontScale < 0) {
        outConfig.fontScale = 1;
    }
}

但是有FONT_SCALEin 用法,所以我检查Configuration了文档指向的那个类getResources().getConfiguration()。所以我可以使用以下方法修复我的代码:

float scale = getResources().getConfiguration().fontScale;

由于我的问题是要以像素为单位计算正确的字体大小,这就是我现在在 Kotlin 中使用它的方式:

val Number.dpInPx: Int
    get() = TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP, toFloat(), Resources.getSystem().displayMetrics).toInt()

val Number.spInPx: Int
    get() = TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_SP, toFloat(), Resources.getSystem().displayMetrics).toInt()

用法是:

val textSize = 42.spInPx
val padding = 8.dpInPx
于 2013-05-15T06:33:34.837 回答
6

您可以根据字体比例设置系统字体。

示例:对于大字体比例为 2.0 则您可以设置如下。

Configuration config = new Configuration();
config.fontScale = 2.0f;
getResources().getConfiguration().setTo(config);
于 2014-08-19T18:47:32.963 回答
3

将“float def”参数添加到末尾

public static float getFloat(ContentResolver cr, String name, float def)

例子:

scale = android.provider.Settings.System.getFloat(getActivity().getContentResolver(),
                                    android.provider.Settings.System.FONT_SCALE, 1f);
于 2014-12-04T03:54:11.470 回答
-2

你可能会使用getResources().getDisplayMetrics().scaledDensity- http://developer.android.com/reference/android/util/DisplayMetrics.html#scaledDensity

于 2013-05-14T14:31:12.020 回答