【问题标题】:Android: How to change app font size from codeAndroid:如何从代码更改应用程序字体大小
【发布时间】:2011-09-03 23:15:40
【问题描述】:

我有一个要求,我需要根据用户提供的值更改应用程序字体大小。我怎样才能做到这一点?我用谷歌搜索过,但似乎只能从 XML 布局中完成。

【问题讨论】:

    标签: android font-size


    【解决方案1】:

    在 values 目录下的 styles.xml 文件中定义样式并自定义您想要的任何内容。我正在使用 textSize 11sp

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
            <item name="colorPrimary">@color/colorPrimary</item>
            <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
            <item name="colorAccent">@color/colorAccent</item>
            <item name="android:textColor">@color/textColorTitle</item>
            <item name="android:textSize">11sp</item>
            <item name="android:textColorSecondary">@color/colorAccent</item>
            <item name="buttonStyle">@style/ButtonStyle</item>
        </style>
    

    在清单文件中适用于您的活动,例如

    <activity
                android:name=".view.activities.MainActivity"
                android:label="@string/title_activity_main"
                android:theme="@style/AppTheme" />
    

    【讨论】:

      【解决方案2】:

      您必须在值和此文件中创建文件styles.xml

      <resources>
          <style>
              <item name="android:textSize">20sp</item>
          </style>
      </resources>
      

      【讨论】:

      • 这不是theme.xml,这是style.xml
      【解决方案3】:

      似乎我无法更改应用程序字体大小,我必须单独更改单个元素的字体大小。

      【讨论】:

      • 投反对票的不是我。但是为什么不接受@CommonsWare 的回答(因为您没有提出任何新内容)?
      【解决方案4】:

      我能想到的唯一方法是扩展 TextView 并让它们检查每个 onDraw() 上的全局 textSize 变量。它不应该给绘图增加太多开销。

      【讨论】:

        【解决方案5】:

        你可以改变文本视图的文本大小

        textview.setTextSize(int_value);
        

        这是你的意思吗?

        【讨论】:

          【解决方案6】:

          在每个TextView(或从TextView 继承的其他小部件,例如Button)上调用setTextSize()

          【讨论】:

          • 我希望整个应用程序的文本大小发生变化,即所有活动中的所有视图。我可以设置/更改应用程序级别的任何设置来控制整个应用程序的文本大小吗?
          • 有没有更好的办法?我认为我们可以通过更新应用程序上下文并重新启动应用程序来更新整个应用程序的字体,但最好实时更新字体大小(无需重新启动应用程序)。可以通过继承每个小部件类并使用使用 App 上下文初始化的 ViewModel 并观察新派生类中的值。有没有更好的办法?
          • @ZaidMirza:“我认为我们可以通过更新应用程序上下文并重新启动应用程序来更新整个应用程序的字体”——我不知道您所说的“更新应用程序上下文”或“重新启动应用程序”是什么意思应用程序”。 “可以通过继承每个小部件类并使用使用 App 上下文初始化的 ViewModel 并观察新派生类中的值来实现。?” - 恕我直言,这是一个不明智的架构。 “有没有更好的办法?” - 我不喜欢这个问题的“要求”。如果我今天必须这样做,我可能会使用数据绑定。在 2021 年及以后,Jetpack Compose 应该会大大简化这一点。
          • @ZaidMirza:“观察者将是派生类,如“MyTextView”、“MyRadioButton”。” ——我觉得这是一个不明智的架构。 “我们可以使用 context.resources.fontScale(newValue) 做同样的事情”——AFAICT,不存在。你可以try createConfigurationContext(),但我怀疑你会遇到问题。
          • @ZaidMirza:“我们没有任何优化的解决方案可以在运行时更改字体大小”——同意。 Android 假定字体决策在很大程度上是静态的,由您在编译时选择的字体大小和用户的字体比例来驱动。而且,就字体大小在运行时更改的程度而言,通常是基于文本长度(自动调整大小)。正如 Android 未设置为允许应用更改语言环境一样,它也未设置为允许应用更改字体大小。两者都可以实现,但您实际上是在“逆流而上”。
          猜你喜欢
          • 2013-08-02
          • 2019-04-20
          • 2013-05-20
          • 2020-10-20
          • 1970-01-01
          • 1970-01-01
          • 2011-09-07
          • 1970-01-01
          • 2012-05-11
          相关资源
          最近更新 更多