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
相关产品推荐
相关产品推荐

