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

如何以编程方式更改整个应用程序中的字体大小,Android?,android,font-size,android-fonts,Android,Font Size,Android Fonts,我已经创建了Spinner,其字体大小列表从“8”到“46”。我可以点击字体大小,并在一个微调器中显示出来 我的需要是,如果我在微调器中单击字体大小“26”,那么它应该应用于我的整个项目。像应用到我的屏幕,文本视图外观,编辑文本-粗体/斜体等等。如果我再次点击46大小,那么它应该适用于我的整个项目 如何通过编程实现这一点?创建一个函数并将微调器大小值作为 void setSize(int size){ ... setTextSize() // on All of the layout texts

我已经创建了Spinner,其字体大小列表从“8”到“46”。我可以点击字体大小,并在一个微调器中显示出来

我的需要是,如果我在微调器中单击字体大小“26”,那么它应该应用于我的整个项目。像应用到我的屏幕,文本视图外观,编辑文本-粗体/斜体等等。如果我再次点击46大小,那么它应该适用于我的整个项目


如何通过编程实现这一点?

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

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

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


查看文档

可能的解决方案是创建一个扩展TextView的基类,并将该文本视图类用作编辑文本。希望您在第一屏中要求尺寸。在任何情况下,都可以在基类中设置文本大小。这会解决你的问题

就像你在package com.example中创建这个类一样,类名是BaseTextView,然后在xml文件中而不是
中编写


希望这能有所帮助。

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

我认为黑魔鬼给出的答案有一个问题

问题是许多
Android
widgets子类
TextView
,例如
按钮
单选按钮
,以及
复选框
。其中一些是
TextView
的间接子类,这使得在这些类中实现自定义版本的
TextView
非常困难

然而,正如Siddharth Lele在其评论中指出的,,使用
样式
主题
是处理整个应用程序中文本大小变化的更好方法

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

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>
最后,通过扩展BaseActivity创建活动,如下所示:

public class AppActivity extends BaseActivity{
}
因为大多数应用程序的活动量比继承TextView的TextView或小部件少得多。这将是指数级的,因此随着复杂性的增加,此解决方案需要更少的代码更改


多亏了

您可以使用基本活动配置向上/向下缩放应用程序的文本大小,使所有活动都成为基本活动

比例正常值为1.0,2.0将使字体大小加倍,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());
}

要缩放所有组件(指整个应用程序)的字体大小,有一种非常好的方法,可以通过几个设备实现和测试。此解决方案可应用于以下情况:;静态声明dp大小单位(默认为android sp),缩放到所需的字体大小等

该解决方案与Usama Saeed US给出的解决方案类似,但将涵盖所有故障情况

声明将缩放字体大小的静态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));
}

我不确定它是否有用。但是有一种称为“SSP”的东西——文本的可伸缩大小单位。 将此添加到构建渐变中

implementation 'com.intuit.ssp:ssp-android:1.0.6'
这个要用吗

android:textSize="@dimen/_22ssp"

我假设您希望创建某种首选项来更改整个应用程序中的文本大小。您可以为此创建样式。但是动态的,不使用样式和主题。我怎么能这么做?任何想法!!!这回答了你的问题吗?答案正是你所需要的。@Meena Rengarajan你能不能解释一下,因为你已经接受了这个正确的答案。我也这么做了,但没有工作。一些提示PLZ工作得很好。不缩放工具栏标题大小,因为这是在主题的“dp”中深入定义的。提供的代码不考虑用户的缩放设置(在“设置/辅助功能/字体大小”中),但可以很容易地添加。谢谢,这很有效。为了获取帐户用户的刻度,我使用了以下参数:systemScale=Settings.System.getFloat(context.getContentResolver(),Settings.System.FONT\u scale,1f);configuration.fontScale=scale*systemScale//剩下的时间里,实现这个目标最简单的方法就是这样。。。我实现了这个,我现在是一个令人满意的开发人员!
android:textSize="@dimen/_22ssp"