ActionBar 选项卡标题中的自定义字体

2023-11-29

我正在尝试在我的上设置自定义字体ActionBar选项卡的标题。

我看到更多的开发人员要求以正确的方式在 SO 上执行此操作(例如如何自定义操作栏选项卡的字体 & 如何(如果可能)在选项卡文本的 ActionBar 中使用资产文件夹中的字体设置自定义字体?)但没有答案。

到目前为止,我采用了两种方法:

1)第一个是inspired这样所以问题包括为每个选项卡扩展自定义布局:

LayoutInflater inflater = LayoutInflater.from(this);
View customView = inflater.inflate(R.layout.tab_title, null); // a custom layout for the tab title, basically contains a textview...

TextView titleTV = (TextView) customView.findViewById(R.id.action_custom_title);
        titleTV.setText(mSectionsPagerAdapter.getPageTitle(i));
        titleTV.setGravity(Gravity.CENTER_VERTICAL);
        titleTV.setTypeface(((MyApp) getApplicationContext()).getCustomTypeface());

// ...Here I could also add any other styling I wanted to...

actionBar.getTabAt(i).setCustomView(customView);

这看起来不是一个很好的方法,因为如果选项卡 + 操作不适合横向模式下的 ActionBar,选项卡标题将显示在溢出列表(旋转器/下拉列表)中,但所选值显示为空的。当您单击此列表的项目时,所有这些视图都会消失。例如,当用户展开搜索操作视图导致 Android 将选项卡显示为下拉菜单时,这尤其令人烦恼。

2)我尝试了另一种方法here其中涉及使用SpannableString但字体并没有变成我的自定义字体。

SpannableString s = new SpannableString(mSectionsPagerAdapter.getPageTitle(i));
s.setSpan(new TypefaceSpan(this, "FontName.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
actionBar.addTab(actionBar.newTab().setText(s).setTabListener(this));

可以看到类TypefaceSpanhere.

So...

有谁知道正确的造型方法ActionBar选项卡标题的字体来自“/assets/fonts/...”?任何帮助将不胜感激。

EDIT:

更多关于第二种方法。 我正在使用的 TypefaceSpan 类实际上是android.text.style.TypefaceSpan正如用户 @twaddington 所介绍的:如何在 ActionBar 标题中设置自定义字体?

EDIT 2:

在之前的链接中,有评论指出:“如果底层 TextView 上的 textAllCaps 属性设置为 true(例如通过主题),则自定义字体将不会出现。当我将此技术应用于操作栏选项卡项时,这对我来说是一个问题”.

我更改了样式,将 textAllCaps 设置为 false,现在第二种方法似乎可以工作。我会稍微测试一下并发布结果。

结论:

先前编辑中的解决方案似乎有效。

将@CommonsWare 的答案标记为其相关性正确。

@PeteH 的 PS 编辑:

我六个月前问过这个问题,所以我不记得所有细节。我相信对于这个应用程序,我最终采用了不同的导航方法。我现在在应用程序中所能找到的(关于刷卡......)是Activity其布局包含ViewPager with a PagerTabStrip,我的样式是这样的:

// Style the Tab Strip:
Typeface tf = ((MyApplication) getApplication()).getTabStripTypeface(); // Used this to keep a single instance of the typeface (singleton pattern) and avoid mem. leaks
PagerTabStrip strip = (PagerTabStrip) findViewById(R.id.pager_title_strip);
strip.setTabIndicatorColor(getResources().getColor(R.color.myColor));
strip.setDrawFullUnderline(true);
for (int i = 0; i < strip.getChildCount(); ++i) {
    View nextChild = strip.getChildAt(i);
    if (nextChild instanceof TextView) {
        TextView textViewToConvert = (TextView) nextChild;
                    textViewToConvert.setAllCaps(false); 
        textViewToConvert.setTypeface(tf);
    }
}

但这与这个问题中提出的问题不同。

我能找到的唯一相关代码是这个,我在其中设置了一个SpannableString:

// For each of the sections in the app, add a tab to the action bar.
for (int i = 0; i < mSectionsPagerAdapter.getCount(); i++) {
    SpannableString s = new SpannableString(mSectionsPagerAdapter.getPageTitle(i));
    s.setSpan(new TypefaceSpan(this, "FontName.ttf"), 0, s.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    actionBar.addTab(actionBar.newTab().setText(s).setTabListener(this));
}

...而在我的 styles.xml 中,我的操作栏选项卡文本的样式如下:

<!-- action bar tabtext style -->
<style name="ActionBarTabText.MyApplication" parent="@android:style/Widget.Holo.ActionBar.TabText">
    <item name="android:textAppearance">@android:style/TextAppearance.Holo.Medium</item>
    <item name="android:textColor">?android:attr/textColorPrimaryInverse</item>
    <item name="android:textSize">15sp</item>
    <item name="android:textStyle">bold</item>
    <item name="android:textAllCaps">false</item>
    <item name="android:ellipsize">marquee</item>
    <item name="android:maxLines">1</item>
</style>

TypefaceSpan仅适用于三种内置字体。

话虽如此,forking TypefaceSpan使用其中一个Typeface从本地文件路径加载应该不那么难。而不是治疗String在构造函数中作为面部家族名称,您可以将其视为本地文件路径,调整apply()从那里加载它。Typeface本身不是Parcelable,因此您需要使用该路径。

获取问题Typeface从资产来看,TypefaceSpan需要访问AssetManager,并且在放入并重建后,它不会轻易访问一个Parcel.

我没有使用过你的第一种技术,但我对你遇到问题并不感到惊讶。

您也可以考虑完全删除操作栏选项卡并切换到ViewPager带有选项卡式指示器,因为您可能可以更轻松地设计,例如 Jake Wharton 的TabPageIndicator.

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

ActionBar 选项卡标题中的自定义字体 的相关文章

随机推荐

  • 使用 jQuery 获取边框样式

    我如何使用 jQuery 获得边框样式 以下内容不起作用 get click function var x div css borderStyle alert x Check http jsfiddle net s7YAN 31 alert
  • Mozilla 3.0.8 和 Chrome 高度错误解决方法

    我有一个textarea里面一个div div div
  • 使用大小写“透视”键|值表会返回空白列... mySQL

    我正在尝试将键 值格式的数据转换为每个条目一行 源数据库是 mysql 我知道我需要使用 Case 语句才能进行透视 并且遵循了该站点上的一些示例来构建我的查询 但是 我只返回一列数据 其余列中为空白 源表格式 user id meta k
  • 分配时的 JavaScript 评估顺序

    JavaScript 在什么时候确定赋值的左侧 是在评估右侧之前还是之后 例如 这段代码的作用是什么 var arr thing 1 thing 2 thing 3 last true arr arr length 1 newField a
  • 通过 PHP 或任何其他脚本创建电子邮件地址

    我需要为我的用户创建代理电子邮件地址 电子邮件地址将类似于 email protected 但最好我想要更好看的电子邮件地址 例如 email protected 发送到此地址的电子邮件应转发到用户不会暴露的真实电子邮件地址 例如 emai
  • 无法对数组类型调用 add

    我得到了一些需要修改的代码 这是一个囚徒困境游戏 最初玩家被设置了这段代码到一个数组中 IPDPlayer currentPlayers new RandomPlayer new TFTPlayer new TFTPlayer new TF
  • 如何在pyglet中连续播放音乐

    我和我的朋友正在开发一款游戏 我们希望音乐在游戏运 行时循环播放 求助 好像没有重复播放音乐的功能 在当前版本的 pyglet 中 您应该使用SourceGroup 设置loop归因于True 然后您可以将其排队到Player播放它 snd
  • javascript倒计时器暂停恢复

    起初 我的倒计时器没有暂停和恢复功能 并且计时器运行得很好 现在我刚刚添加了该功能 暂停没有问题 但恢复时间有问题 时间不会从当前位置开始显示 也不会从那里开始倒计时 如何更改我的代码 pause click function Get cu
  • Android 浮动操作按钮未返回到初始位置

    如果 FAB 浮动操作按钮 在小吃栏出现之前隐藏 在 CoordinatorLayout 中 那么下次我显示 FAB 时 它会在旧位置绘制 不会向下移动到原始位置 如果当小吃栏消失时 FAB 可见 则一切都按预期工作 我错过了什么还是一个错
  • “Set-AzureRmDataFactoryV2”未被识别为 cmdlet 的名称

    我已经在 Ubuntu 16 04 上安装了 Powershell 6 0 0 尝试使用 Powershell 创建 Azure 数据工厂时出现以下错误 Set AzureRmDataFactoryV2 The term Set Azure
  • 获取mp3文件长度

    我目前正在尝试用 C 编写一个音频播放器 我正在使用 BASS 库来处理播放音乐 但现在我在获取歌曲长度方面遇到了小问题 好吧 我读过 BASS 文档并找到了一种方法 我需要做的 所有 就是 int stream Bass BASS Str
  • 使用 Containable 对关联模型 (HABTM) 上的条件过滤的结果进行分页

    我需要对列表进行分页Products 属于特定Category HABTM 协会 In my Product我有的型号 var actsAs array Containable var hasAndBelongsToMany array C
  • 如何在cmake中链接所有LLVM库?

    我想链接我的 cmake C 项目中的所有 LLVM 库 I use llvm config components为了获得 LLVM 的所有组件 它给了我 llvm config components aarch64 aarch64asmp
  • 使用 Greasemonkey 将日期选择器添加到文本框

    有一个需要日期但没有日期选择器的文本框 我想用 Greasemonkey 添加一个 我寻找一个例子 但找不到 这可能吗 有这样做的例子吗 它不需要很花哨 我喜欢用jQuery UI 的 datepicker 因为我通常都会加载 jQuery
  • 为什么 git 会在每个命令名称前添加“git-”?

    如果我需要帮助git status命令 我可以输入git help status 并返回一个帮助页面 显示名称为 git status But git status 不是命令 命令是git status有一个空格 而不是连字符 如果我输入g
  • 来自 Qt 中 main.cpp 代码的 MainWindow

    想要了解之间的代码差异MainWindow和main cpp 具体来说 如何专门编写一段代码main cpp需要修改为的一部分mainwindow cpp and mainwindow h 作为一个例子 我试图修改这个罚款的代码answer
  • 函数返回后不更改指针

    语言是 Go Golang 功能initApp正在接收一个指向对象的指针 Go 中的 struct 在函数内部 我创建一个新的对象指针并初始化该对象的值 打印和调试器都显示在函数返回之前一切都很好 但在返回之后 作为函数参数的指针具有与函数
  • 如何从命令行重建并运行 android 项目

    我想创建与 android studio 通过命令行在后台运行的相同进程 like first clean project gt build project gt Run Project all through command line 可
  • PLC 中的定时器 - 结构化文本

    PLC 结构化文本 ST 中的计时器如何工作 我们如何声明它们 我一直在研究PLC的标准 IEC 61131 3 他们没有谈到ST中的定时器 我知道绝大多数 PLC 程序员都是用梯形图逻辑来完成这些任务 但在这种特殊情况下 我确实需要在 S
  • ActionBar 选项卡标题中的自定义字体

    我正在尝试在我的上设置自定义字体ActionBar选项卡的标题 我看到更多的开发人员要求以正确的方式在 SO 上执行此操作 例如如何自定义操作栏选项卡的字体 如何 如果可能 在选项卡文本的 ActionBar 中使用资产文件夹中的字体设置自