Android:应用程序范围的字体大小偏好

标签 android preferences font-size

是否可以对所有显示文本的 View 使用的字体大小进行应用程序范围的设置? 我想为用户提供一个首选项,它应该允许缩放应用程序中的所有文本。

Android 明确允许使用 "sp" dimension unit对于可缩放的文本,但没有实际的方法来以全局方式设置“用户的字体大小偏好”。

遍历所有关于 Activity 实例化的 View 并不是一个真正的选择 ;-)

最佳答案

这就是我为我的应用制作它的方式。 简而言之 - 在 Activity.onCreate() 中,您可以获得具有特定字体大小集的样式的资源 ID,并将此样式应用于 Activity 主题。然后通过偏好 Activity ,您可以在这些集合之间切换。

首先在 values/attrs.xml 中声明字体大小集的属性:

<declare-styleable name="FontStyle">
    <attr name="font_small" format="dimension" />
    <attr name="font_medium" format="dimension" />
    <attr name="font_large" format="dimension" />
    <attr name="font_xlarge" format="dimension" />
</declare-styleable>

然后在 values/styles.xml 中声明几组字体大小:

<style name="FontStyle">
</style>

<style name="FontStyle.Small">
    <item name="font_small">14sp</item>
    <item name="font_medium">16sp</item>
    <item name="font_large">18sp</item>
    <item name="font_xlarge">20sp</item>
</style>

<style name="FontStyle.Medium">
    <item name="font_small">18sp</item>
    <item name="font_medium">20sp</item>
    <item name="font_large">22sp</item>
    <item name="font_xlarge">24sp</item>
</style>

<style name="FontStyle.Large">
    <item name="font_small">26sp</item>
    <item name="font_medium">28sp</item>
    <item name="font_large">30sp</item>
    <item name="font_xlarge">32sp</item>
</style>

然后在每个activity的onCreate()方法中添加:

getTheme().applyStyle(new Preferences(this).getFontStyle().getResId(), true);

其中 PreferencesSharedPreferences 对象的外观:

public class Preferences {
    private final static String FONT_STYLE = "FONT_STYLE";

    private final Context context;

    public Preferences(Context context) {
        this.context = context;
    }

    protected SharedPreferences open() {
        return context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
    }

    protected Editor edit() {
        return open().edit();
    }

    public FontStyle getFontStyle() {
        return FontStyle.valueOf(open().getString(FONT_STYLE,
            FontStyle.Medium.name()));
    }

    public void setFontStyle(FontStyle style) {
        edit().putString(FONT_STYLE, style.name()).commit();
    }
}

字体样式为:

public enum FontStyle {
    Small(R.style.FontStyle_Small, "Small"), 
    Medium(R.style.FontStyle_Medium, "Medium"), 
    Large(R.style.FontStyle_Large, "Large");

    private int resId;
    private String title;

    public int getResId() {
        return resId;
    }

    public String getTitle() {
        return title;
    }

    FontStyle(int resId, String title) {
        this.resId = resId;
        this.title = title;
    }
}

并且 FontStyle.values() 被用作 PreferencesActivitySpinner 的项目。 这就是我的样子:

public class PreferencesActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    getTheme().applyStyle(new Preferences(this).getFontStyle().getResId(), true);
    super.onCreate(savedInstanceState);

    setContentView(R.layout.preferences);

    Preferences prefs = new Preferences(this);

    Spinner fontStylesView = (Spinner) findViewById(R.id.font_styles);
    FontStylesAdapter adapter = new FontStylesAdapter(this,
            R.layout.font_styles_row, FontStyle.values());
    fontStylesView.setAdapter(adapter);

    fontStylesView.setSelection(prefs.getFontStyle().ordinal());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.preferences, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_done:
        onMenuDone();
        finish();
        return true;
    case R.id.menu_cancel:
        finish();
        return true;
    default:
        return false;
    }
}

private void onMenuDone() {
    Preferences prefs = new Preferences(this);

    Spinner fontStylesView = (Spinner) findViewById(R.id.font_styles);
    prefs.setFontStyle((FontStyle) fontStylesView.getSelectedItem());
}
}

最后你可以使用你的字体大小偏好:

<TextView android:textSize="?attr/font_large" />

或者我更喜欢使用样式,在 values/styles.xml 中添加:

<style name="Label" parent="@android:style/Widget.TextView">
    <item name="android:textSize">?attr/font_medium</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

<style name="Label.XLarge">
    <item name="android:textSize">?attr/font_xlarge</item>
</style>

你可以这样使用它:

<TextView style="@style/Label.XLarge" />

希望我的回答对你有所帮助。

关于Android:应用程序范围的字体大小偏好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4877153/

相关文章:

Java方法调用格式

iphone - 向 iPhone 首选项/设置包添加按钮?

Android 首选项 Activity IllegalArgumentException : Invalid fragment for this activity

ios - 默认 UIButton 中的标题是什么大小的字体?

java - 如何配置使用 Kalium 的 Java 库在 Mac OSX 和 Android 上运行?

android - 如何让键盘顺利进出屏幕

html - 字体大小相对于父级的大小

css - 我可以根据字体可用性设置字体大小吗?

android - 这种从sqlite获取数据的方式正确吗?

android - 在 PreferenceActivity.onResume (Android) 中更改首选项时更新 View