如何以编程方式更改整个应用程序中的字体大小,Android?

时间:2012-10-03 08:00:10

标签: android font-size android-fonts

我创建了Spinner,其字体大小从“8”到“46”。我可以单击字体大小并在它向我显示的微调器中。

我需要的是,如果我在Spinner中单击字体大小“26”,那么它应该应用于我的整个项目。就像应用于我的屏幕,Textview外观,Edittext - Bold / Italic等。再次,如果我点击46大小,那么它应该适用于我的整个项目。

我怎么能通过编程方式做到这一点?

6 个答案:

答案 0 :(得分:23)

Android文档并未具体说明通过用户在应用程序级别选择全局更改字体大小的最有效方法。

我认为 Black Devil 给出的answer存在问题。

问题是许多Android小部件都是TextView的子类,例如ButtonRadioButtonCheckBox。其中一些是TextView的间接子类,这使得在这些类中实现TextView的自定义版本非常困难。

然而,正如Siddharth Lele在其评论中指出,使用stylesthemes是更好的方法来处理整个应用中文本大小的变化。

我们为布局设置样式以控制视图的外观。主题基本上只是这些风格的集合。但是,我们可以使用主题仅用于文本大小设置;没有为每个属性定义值。使用样式主题为我们提供了一个巨大的优势:我们可以以编程方式为整个视图设置主题。

<强> theme.xml

<resources>
    <style name="FontSizeSmall">
        <item name="android:textSize">12sp</item>
    </style>
    <style name="FontSizeMedium">
        <item name="android:textSize">16sp</item>
    </style>
    <style name="FontSizeLarge">
        <item name="android:textSize">20sp</item>
    </style>
</resources>

创建一个类来处理加载我们的首选项:

public class BaseActivity extends Activity {
    @Override
    public void onStart() {
        super.onStart();

        // Enclose everything in a try block so we can just
        // use the default view if anything goes wrong.
        try {
            // Get the font size value from SharedPreferences.
            SharedPreferences settings =
                getSharedPreferences("com.example.YourAppPackage", Context.MODE_PRIVATE);

            // Get the font size option.  We use "FONT_SIZE" as the key.
            // Make sure to use this key when you set the value in SharedPreferences.
            // We specify "Medium" as the default value, if it does not exist.
            String fontSizePref = settings.getString("FONT_SIZE", "Medium");

            // Select the proper theme ID.
            // These will correspond to your theme names as defined in themes.xml.
            int themeID = R.style.FontSizeMedium;
            if (fontSizePref == "Small") {
                themeID = R.style.FontSizeSmall;
            }
            else if (fontSizePref == "Large") {
                themeID = R.style.FontSizeLarge;
            }

            // Set the theme for the activity.
            setTheme(themeID);
        }
        catch (Exception ex) {
            ex.printStackTrace();
        }
    }

最后,通过扩展BaseActivity来创建活动,如下所示:

public class AppActivity extends BaseActivity{
}

由于大多数应用程序的活动量比继承TextView的TextView或小部件少得多。随着复杂性的增加,这将呈指数级增长,因此该解决方案需要较少的代码更改。

感谢Ray Kuhnell

答案 1 :(得分:6)

您可以使用基本活动配置向上/向下扩展到应用的文字大小,使所有活动成为固有的基本活动。

缩放正常值为1.0,2.0会使字体大小加倍,而.50会使其缩小一半。

public  void adjustFontScale( Configuration configuration,float scale) {

    configuration.fontScale = scale;
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(metrics);
    metrics.scaledDensity = configuration.fontScale * metrics.density;
    getBaseContext().getResources().updateConfiguration(configuration, metrics);

}

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    adjustFontScale( getResources().getConfiguration());
}

答案 2 :(得分:2)

可能的解决方案是创建基类,其中扩展TextView ,并将此文本视图类用作编辑文本。希望你在第一个屏幕上要求尺寸。无论如何,你在基类中设置文本大小。这将解决您的问题。

就像你在com.example包中创建这个类而类名是BaseTextView,然后在xml文件而不是<TextView .../>中你会写<com.example.BaseTextView ... />

希望这有帮助。

答案 3 :(得分:1)

要缩放所有组件的字体大小(意味着整个应用程序),有一种很好的方法可以通过多个设备来实现和测试。该解决方案可应用于类似情况;静态声明 dp 大小单位(默认为android sp),缩放为所需的字体大小等。

该解决方案类似于 Usama Saeed US 给出的answer,但将涵盖所有有问题的案例。

声明将缩放字体大小的静态util方法。

    //LocaleConfigurationUtil.class
    public static Context adjustFontSize(Context context){
        Configuration configuration = context.getResources().getConfiguration();
        // This will apply to all text like -> Your given text size * fontScale
        configuration.fontScale = 1.0f;

        return context.createConfigurationContext(configuration);
    }

在您的所有活动中,覆盖attachBaseContext并在onCreate中调用util方法。

   @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(LocaleConfigurationUtil.adjustFontSize(newBase));
    }

   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LocaleConfigurationUtil.adjustFontSize(this);
    }

如果您使用的是片段,则重写onAttach方法

@Override
public void onAttach(Context context) {
super.onAttach(LocaleConfigurationUtil.adjustFontSize(context));
}

答案 4 :(得分:0)

创建一个函数并将微调器大小值传递为

void setSize(int size){
...
setTextSize()
// on All of the layout texts and views on screen

}

在屏幕上的所有视图和布局文本上调用setTextSize()。

查看文档Here

答案 5 :(得分:-1)

我不确定是否有帮助。但是有些东西叫做“ SSP”-文本的可缩放大小单位。 将此添加到您的构建gradle

implementation 'com.intuit.ssp:ssp-android:1.0.6'

要使用的

android:textSize="@dimen/_22ssp"

https://github.com/intuit/ssp