You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:如何保存TextView字体样式至SharedPreferences实现重启恢复?

关于Android字体样式持久化的解决方案

嘿,这个需求我太熟悉了!先直接给你答案:不能直接把Typeface对象存储到SharedPreferences里——因为SharedPreferences只支持布尔、字符串、整数这类基础数据类型,Typeface是复杂对象,没法直接序列化存储。不过有好几种简单靠谱的替代方案,咱们来唠唠:

可行的实现方案

1. 存储字体样式的单个状态(最常用)

既然你是用三个复选框分别控制加粗、斜体、下划线,那直接把这三个复选框的选中状态(布尔值)存在SharedPreferences里就好。重启App后读取这些状态,再动态给TextView设置样式就行,逻辑清晰还容易维护。

2. 存储样式组合标记(精简存储)

如果想省点存储空间,可以用一个整数来标记样式组合:比如用二进制位对应不同样式——第0位代表加粗,第1位代表斜体,第2位代表下划线。选中某个样式就把对应位设为1,最后存这个整数。读取的时候解析每一位的状态,再应用样式。不过这个方案比第一种稍复杂一点,适合追求精简存储的场景。

3. 你的选择:存储单个复选框状态(已实现)

看你说已经采用了这个方案,那我把完整的代码示例补全一下,方便参考:

第二个Activity中保存状态:

// 在复选框的OnCheckedChangeListener里保存状态
checkBoxBold.setOnCheckedChangeListener((buttonView, isChecked) -> {
    saveFontStyleState("isBold", isChecked);
});
checkBoxItalic.setOnCheckedChangeListener((buttonView, isChecked) -> {
    saveFontStyleState("isItalic", isChecked);
});
checkBoxUnderline.setOnCheckedChangeListener((buttonView, isChecked) -> {
    saveFontStyleState("isUnderline", isChecked);
});

// 封装的保存方法
private void saveFontStyleState(String key, boolean value) {
    SharedPreferences.Editor editor = getSharedPreferences("FontStylePrefs", MODE_PRIVATE).edit();
    editor.putBoolean(key, value);
    editor.apply(); // 异步保存,不阻塞主线程
}

主Activity中读取并应用样式:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView mainTextView = findViewById(R.id.main_text_view);
    SharedPreferences preferences = getSharedPreferences("FontStylePrefs", MODE_PRIVATE);
    
    // 读取之前保存的状态,默认值为false
    boolean isBold = preferences.getBoolean("isBold", false);
    boolean isItalic = preferences.getBoolean("isItalic", false);
    boolean isUnderline = preferences.getBoolean("isUnderline", false);

    // 用SpannableString来组合多种样式
    SpannableString spannableText = new SpannableString(mainTextView.getText());
    int spanFlags = Spannable.SPAN_INCLUSIVE_INCLUSIVE;

    if (isBold) {
        spannableText.setSpan(new StyleSpan(Typeface.BOLD), 0, spannableText.length(), spanFlags);
    }
    if (isItalic) {
        spannableText.setSpan(new StyleSpan(Typeface.ITALIC), 0, spannableText.length(), spanFlags);
    }
    if (isUnderline) {
        spannableText.setSpan(new UnderlineSpan(), 0, spannableText.length(), spanFlags);
    }

    mainTextView.setText(spannableText);
}

总结

推荐用第一种或第三种方案,因为逻辑直白、代码易写易维护,完全能满足你的需求。不用纠结存储Typeface对象,毕竟咱们要的是样式状态的持久化,而不是对象本身~

内容的提问来源于stack exchange,提问作者shadow777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:00:44