23

我已经使用从 "8" 到 "46" 的字体大小列表创建了 Spinner。我可以单击字体大小并在它显示给我的微调器中。

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

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

4

6 回答 6

31

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

黑魔王回答我觉得有问题。

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

然而,正如Siddharth Lele 在他的评论中指出的那样,使用stylesorthemes是更好的方式来处理整个应用程序中文本大小的变化。

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

主题.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 或小部件少得多。随着复杂性的增加,这将呈指数级增长,因此该解决方案需要的代码更改更少。

感谢雷·库内尔

于 2014-07-04T09:51:23.957 回答
23

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

比例正常值为 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());
}
于 2018-04-07T18:09:26.253 回答
5

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

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

希望这可以帮助。

于 2012-10-03T10:12:54.077 回答
0

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

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

}

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

在此处查看文档

于 2012-10-03T08:06:20.873 回答
0

为了缩放所有组件的字体大小(意味着整个应用程序),有一种很好的方法可以通过多个设备实现和测试。此解决方案可应用于以下情况;静态声明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));
}
于 2020-03-04T18:11:51.797 回答
-1

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

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

这要使用

android:textSize="@dimen/_22ssp"

https://github.com/intuit/ssp

于 2020-08-19T02:30:54.297 回答