Android - 字体共享首选项

Android - Typeface Shared Preferences

提问人:shadow777 提问时间:4/5/2018 最后编辑:shadow777 更新时间:4/5/2018 访问量:143

问:

首先,我有一个包含 2 个活动的应用程序。第一个是主要的。在第 2 个复选框中,有 3 个复选框正在更改主活动中 textview 的字体(粗体、斜体和下划线)。我想做的是在关闭并重新打开应用程序后,文本视图具有先前选择的字体。 有没有办法将字体存储在共享首选项中,或者可以通过其他方式完成?

谢谢

更新

这有效(答案下面的第三种方法)

    boolean loadCheck1 = preferences.getBoolean("checked1", false);
    if (loadCheck1) {
            tx.setTypeface(tx.getTypeface(), Typeface.BOLD);
    } else {
        tx.setTypeface(null, Typeface.NORMAL);
    }

    boolean loadCheck2 = preferences.getBoolean("checked2", false);
    if (loadCheck2) {
        tx.setTypeface(tx.getTypeface(), Typeface.ITALIC);
    } else {
        tx.setTypeface(null, Typeface.NORMAL);
    }

    boolean loadCheck3 = preferences.getBoolean("checked3", false);
    if (loadCheck3){
        tx.setPaintFlags(tx.getPaintFlags()| Paint.UNDERLINE_TEXT_FLAG);
    } else {
    tx.setPaintFlags(tx.getPaintFlags() & (~Paint.UNDERLINE_TEXT_FLAG));
    }

但是 Typeface Bold 存在一个问题。即使选中了 checkbox1,也不会出现粗体。这真的很奇怪,因为每一个如果都是以同样的方式制作的。此外,如果我更改顺序(例如 loadcheck2、loadcheck3、loadcheck1),则不会出现斜体。

Android 文本视图 android-sharedpreferences

评论


答:

1赞 Tomas Jablonskis 4/5/2018 #1
  • 您可以使用 GSON 库将类 ( extends ) 存储在 中。有关此方法的详细信息:Android SharedPreferences 如何保存/存储对象ObjectTypefaceObjectSharedPrefereces

  • 如果不想使用任何外部库,则可以创建一个 或 类,其中包含表示要保存和存储该变量的特定变量的 类。当用户重新打开应用程序时,只需检索该变量并使用语句来确定要使用的变量。enuminterfaceTypefaceSharedPreferencesswitchTypeface

  • 在其中存储一个值,该值表示在销毁之前选择的值。然后在开始检索该值并检查选择了哪个值,然后选择相应的 .SharedPreferencesCheckBoxActvityActivityCheckBoxTypeface


我建议使用第二种或第三种方法,因为与其他方法相比,存储可能会带来一些性能缺陷。TypefaceSharedPreferences


评论

0赞 shadow777 4/5/2018
伟大!多谢!但我还有另一个问题。请看更新的问题。
0赞 Tomas Jablonskis 4/5/2018
我很高兴它奏效了。我建议您添加一些断点并调试您的代码。
0赞 Tomas Jablonskis 4/5/2018
顺便说一句,您的目标是在彼此之间使用几种字体,例如:粗体 + 斜体 / 粗体 + 下划线 / 粗体 + 斜体 + 下划线?还是只有一个?因为目前,如果前 2 个条件为真,那么第二个条件将首先覆盖。ifif
0赞 shadow777 4/5/2018
取决于所选复选框(如果选择了“粗体”和“斜体”,则文本应为“粗体”和“斜体”等)。但仍然不知道为什么只有两个人在工作。以前它们都在工作,代码也完全相同。
0赞 Tomas Jablonskis 4/5/2018
然后,正如我上面提到的,如果粗体条件和斜体条件都是,那么第二个条件将始终覆盖第一个条件。只需在第二秒使用它:trueiftx.setTypeface(null, Typeface.ITALIC | Typeface.BOLD);