Android:应用程序范围内的字体大小首选项

2024-04-13

是否可以对所有显示文本的视图使用的字体大小进行应用程序范围的设置? 我想向用户提供一个首选项,该首选项应该允许缩放应用程序中的所有文本。

Android 明确允许使用“sp”尺寸单位 http://developer.android.com/guide/topics/resources/more-resources.html#Dimension对于可缩放文本,但是没有实际的方法来以全局方式设置“用户的字体大小首选项”。

迭代 Activity 实例化的所有视图并不是一个真正的选择;-)


这就是我为我的应用程序制作的方法。 简而言之——在Activity.onCreate()您可以获取具有特定字体大小集的样式的资源 ID,并将该样式应用于活动主题。然后,通过首选项活动,您可以在这些集合之间切换。

首先在values/attrs.xml中声明字体大小集的属性:

<declare-styleable name="FontStyle">
    <attr name="font_small" format="dimension" />
    <attr name="font_medium" format="dimension" />
    <attr name="font_large" format="dimension" />
    <attr name="font_xlarge" format="dimension" />
</declare-styleable>

然后在values/styles.xml中声明几组字体大小:

<style name="FontStyle">
</style>

<style name="FontStyle.Small">
    <item name="font_small">14sp</item>
    <item name="font_medium">16sp</item>
    <item name="font_large">18sp</item>
    <item name="font_xlarge">20sp</item>
</style>

<style name="FontStyle.Medium">
    <item name="font_small">18sp</item>
    <item name="font_medium">20sp</item>
    <item name="font_large">22sp</item>
    <item name="font_xlarge">24sp</item>
</style>

<style name="FontStyle.Large">
    <item name="font_small">26sp</item>
    <item name="font_medium">28sp</item>
    <item name="font_large">30sp</item>
    <item name="font_xlarge">32sp</item>
</style>

Then in onCreate()每个活动的方法添加:

getTheme().applyStyle(new Preferences(this).getFontStyle().getResId(), true);

where Preferences是一个门面SharedPreferences object:

public class Preferences {
    private final static String FONT_STYLE = "FONT_STYLE";

    private final Context context;

    public Preferences(Context context) {
        this.context = context;
    }

    protected SharedPreferences open() {
        return context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
    }

    protected Editor edit() {
        return open().edit();
    }

    public FontStyle getFontStyle() {
        return FontStyle.valueOf(open().getString(FONT_STYLE,
            FontStyle.Medium.name()));
    }

    public void setFontStyle(FontStyle style) {
        edit().putString(FONT_STYLE, style.name()).commit();
    }
}

和字体样式是:

public enum FontStyle {
    Small(R.style.FontStyle_Small, "Small"), 
    Medium(R.style.FontStyle_Medium, "Medium"), 
    Large(R.style.FontStyle_Large, "Large");

    private int resId;
    private String title;

    public int getResId() {
        return resId;
    }

    public String getTitle() {
        return title;
    }

    FontStyle(int resId, String title) {
        this.resId = resId;
        this.title = title;
    }
}

And FontStyle.values()用作物品Spinner在你的PreferencesActivity。 这就是我的样子:

public class PreferencesActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    getTheme().applyStyle(new Preferences(this).getFontStyle().getResId(), true);
    super.onCreate(savedInstanceState);

    setContentView(R.layout.preferences);

    Preferences prefs = new Preferences(this);

    Spinner fontStylesView = (Spinner) findViewById(R.id.font_styles);
    FontStylesAdapter adapter = new FontStylesAdapter(this,
            R.layout.font_styles_row, FontStyle.values());
    fontStylesView.setAdapter(adapter);

    fontStylesView.setSelection(prefs.getFontStyle().ordinal());
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.preferences, menu);
    return super.onCreateOptionsMenu(menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_done:
        onMenuDone();
        finish();
        return true;
    case R.id.menu_cancel:
        finish();
        return true;
    default:
        return false;
    }
}

private void onMenuDone() {
    Preferences prefs = new Preferences(this);

    Spinner fontStylesView = (Spinner) findViewById(R.id.font_styles);
    prefs.setFontStyle((FontStyle) fontStylesView.getSelectedItem());
}
}

最后,您可以使用您的字体大小首选项:

<TextView android:textSize="?attr/font_large" />

或者我更喜欢使用样式,在values/styles.xml中添加:

<style name="Label" parent="@android:style/Widget.TextView">
    <item name="android:textSize">?attr/font_medium</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
</style>

<style name="Label.XLarge">
    <item name="android:textSize">?attr/font_xlarge</item>
</style>

你可以这样使用它:

<TextView style="@style/Label.XLarge" />

希望我的回答对您有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:应用程序范围内的字体大小首选项 的相关文章

随机推荐

  • 在开关块中实例化新对象 - 为什么会失败?

    为什么 switch document currentTool case DrawLine NSBezierPath testPath NSBezierPath alloc init rest of code that uses testP
  • 用于类型比较的 Boost 静态断言

    以下问题给我编译器错误 我不知道如何正确编写它 struct FalseType enum value false struct TrueType enum value true template
  • 将 SAML 断言响应/安全上下文传播到下游服务/应用程序

    我们的环境中有多种服务 在某些情况下 我们希望用户自动登录 静默登录一个或多个参与服务 而不会受到身份提供者的凭据质询 也不会在第一次从一项服务成功登录后与身份提供者进行通信 例如 我们有一个前端 UI 应用程序 我们希望使用 Spring
  • 即使覆盖 JPanel 的 PaintComponent() 方法,Java 图形也不会在 Mac 上显示

    我正在开发一个小型游戏项目 并且遇到了 java 图形未显示的问题 我在 Stackoverflow 上搜索了类似的问题 并使用了许多人建议的重写 JPanel 的 PaintComponent 方法 但我仍然遇到这个问题 我希望同时获得我
  • 如何删除 Intellij IDEA 13 布局预览中的渲染问题消息窗口

    那么如何彻底去除这个 渲染问题 每次更改布局中的某些内容时 Intellij IDEA 13 中的 Android 布局预览区域上方都会出现消息吗 您可以使用 isInEditMode 方法 检查示例 import android cont
  • 禁用 FlipView 上的导航

    我想禁用我的所有导航FlipView 水平滚动 来自用户的输入 例如鼠标滚轮和触摸屏 Flipview 应该以编程方式更改其选定索引的唯一方法 我已经删除了FlipView的风格 我尝试改变一些ScrollViewer其风格的属性 但我无法
  • 在构建语义 Web 应用程序时,OWL 是如何实际使用的?

    我一直在阅读有关语义 Web 技术 例如 RDF 和 OWL 的内容 并且对在现有关系数据库之上构建 RDF 三重存储语义数据库的可能性很感兴趣 这只是一项研发活动 看看我能做什么 我喜欢的样子OWLIM http www ontotext
  • 使用 Autodesk Forge API 检索“描述”或“自定义属性”字段

    我们正在尝试使用 Autodesk Forge API 请求 命令检索 BIM360 文档中所示的描述或自定义属性字段 我们尝试了以下请求来检索有关特定文件的信息 https forge autodesk com en docs data
  • 如何确定 REST api 中的请求来自何处

    我有一个带有控制器的 RESTful API 当我的 Android 应用程序点击它时 它应该返回一个 JSON 响应 当它被 Web 浏览器点击时 它应该返回一个 视图 我什至不确定我是否以正确的方式处理这个问题 我正在使用 Larave
  • HttpContext.Authentication.SignOutAsync 不会删除身份验证 cookie

    根据 ASP NET Core文档 https learn microsoft com en us aspnet core security authentication cookie方法HttpContext Authentication
  • 在 C# 中使用 Moq 进行模拟

    我有以下代码 public interface IProductDataAccess bool CreateProduct Product newProduct Class ProductDataAccess实现该接口 public cla
  • 使用 JavaScript 获取资源的传输大小

    我正在尝试测量真实网站用户的页面加载性能 为了更好地理解数据 我想根据缓存是否已启动来对数据进行分段 因此 在加载资源之前我不需要知道它是否在缓存中 事后衡量就足够了 至少在 Chrome 和 Firefox 中 开发工具的 网络 选项卡有
  • 当鼠标悬停在一个列表元素上时,jQuery 使其他列表元素淡入淡出/变暗,我在那里 90%..?

    我有一个无序列表 其中可能有 30 项 当将鼠标悬停在其中一项上时 其余列表项会淡出至 30 而悬停的项目将保持 100 当你离开列表时 它们都会恢复到 100 我已经做到了 当您从一个项目移动到另一个项目时 我的问题就出现了 其他列表项目
  • 删除 WSO2 1.10.0 中的弱化协议

    我有一个答案 可以禁用 Tomcat 中管理控制台不需要的协议 密码 基于 TLSv1 0 和 3DES 的密码 端口 9443 禁用 WSO2AM 1 10 0 中的弱化协议 密码 https stackoverflow com ques
  • SAS SQL 传递

    我想知道在这段代码中 SAS SQL 传递中首先执行的是什么 Connect To OLEDB As MYDB DBConnect Catalog MYDB Create table MYDB extract as select put P
  • JVM 语言中的嵌套函数和词法作用域是如何编译的?

    作为我的问题的具体示例 这里有一个 Python 代码片段 它应该对最广泛的人来说是可读的 并且无论如何都有 JVM 实现 def memo f cache def g args if args not in cache cache arg
  • 如何使用 pyplot 在曲面图后面画一条线

    我想在用曲面图绘制的圆环内画一条线 这条线在圆环内部不应该是可见的 就像圆环的内侧一样 只能在圆环的 末端 看到 我切掉了圆环的一半 然而 我绘制的线随处可见 正如您在图中看到的那样 我使用了以下代码 import numpy as np
  • Windows XP 上 WPD/WIA 的替代品?

    WPD http www microsoft com whdc device wpd default mspx在 Windows XP SP1 如果重要的话 上无法正常工作 即使微软表示确实如此 http msdn microsoft co
  • 延迟加载 WPF 选项卡内容

    我的 WPF 应用程序被组织为 TabControl 每个选项卡包含不同的屏幕 一个 TabItem 绑定到需要一点时间加载的数据 由于此 TabItem 代表用户可能很少使用的屏幕 因此我希望在用户选择该选项卡之前不加载数据 我怎样才能做
  • Android:应用程序范围内的字体大小首选项

    是否可以对所有显示文本的视图使用的字体大小进行应用程序范围的设置 我想向用户提供一个首选项 该首选项应该允许缩放应用程序中的所有文本 Android 明确允许使用 sp 尺寸单位 http developer android com gui