当前位置: 首页 > 面试题库 >

ActionBar的标签标题中的自定义字体

管杜吟
2023-03-14
问题内容

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

我看到更多的开发要求一个适当的方式做到这一点的SO可能我设置选项卡上的文字动作条自定义字体,在我的资产字体文件夹?),但没有答案。

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

1)第一个是 受此 SO问题 _启发_的,包括为每个选项卡增加自定义布局:

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)我尝试了 这里介绍的另一种方法,其中涉及使用a,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));

类TypefaceSpan可以在这里看到。

所以…

有谁知道使用ActionBar“ / assets / fonts / …”中的字体样式标签标题的正确方法吗?任何帮助将不胜感激。

编辑:

更多关于第二种方法。我正在使用的TypefaceSpan类实际上是android.text.style.TypefaceSpan的一个分叉,由用户@twaddington在此处提供:如何在ActionBar标题中设置自定义字体?

编辑2:

在上一个链接中,有一条注释指出:
“如果在基础TextView上将textAllCaps属性设置为true(例如,通过主题),则自定义字体将不会出现。当我将此技术应用于操作栏标签项”

我更改了样式,将textAllCaps设置为false,现在第二种方法似乎可以使用了。我将对其进行测试,然后发布结果。

结论:

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

将@CommonsWare的答案标记为正确。

@PeteH的PS-EDIT:

我六个月前问过这个问题,所以我不记得所有的细节了。我相信,对于这个应用程序,我最终采用了另一种导航方法。我现在在应用程序中可以找到的所有内容(关于刷卡…)都是Activity其布局包含ViewPager带有的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 仅适用于三种内置字体。

话虽这么说,分叉TypefaceSpan使用Typeface从本地文件路径加载的文件应该并不难。您无需将其String在构造函数中视为人脸姓氏,而应将其视为本地文件路径,并进行调整apply()以从那里加载它。Typeface本身不是Parcelable,因此您需要使用路径。

Typeface从资产获取资产的问题是,资产TypefaceSpan需要进入AssetManager,并且在放入资产并从资产重建后不能轻易获得Parcel

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

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



 类似资料:
  • 问题内容: 如何(如果可能)如何在Assets文件夹中的字体中设置ActionBar标题文本(仅-不是标签文本)中的自定义字体?我不想使用android:logo选项。 问题答案: 我同意不完全支持此操作,但这就是我所做的。您可以将自定义视图用于操作栏(它将显示在图标和操作项之间)。我正在使用自定义视图,并且已禁用本机标题。我所有的活动都继承自一个活动,该活动在onCreate中包含以下代码: 我

  • 我在使用自定义标记库时发现了一个奇怪的问题。在我的一个jsp页面中,自定义tld文件的相对uri路径错误。 Taglib包含在jsp页面中,如下所示 此标记库包含在父jsp文件中,而不是从父jsp文件中导入/包含jsp文件。 我的应用程序还有几个其他jsp文件,其中相同的标记库与正确的路径一起使用。 相同的代码部署在多个测试环境中。在少数环境中,代码会抛出一个错误“找不到资源”,这是意料之中的。但

  • 问题内容: 我正在构建一个实现HTML5音频标签的音乐播放器Web应用程序,但是希望它在所有浏览器中看起来都一样-是否可以定义我自己的自定义CSS?如何? 问题答案: 当前尚无使用CSS设置HTML5 播放器样式的方法。相反,您可以不使用该属性,而使用Javascript实现自己的控件。如果您不想自己全部实现它们,建议您使用现有的主题化HTML5音频播放器

  • 主要内容:自定义标签的语法,简单示例,tld标签库描述文件,自定义标签属性,自定义标签的标签体自定义标签就是用户(开发者)自己定义的标签。自定义标签可以让 JSP 页面中不含有 Java 代码,只含有 HTML 代码和部分标签,就能实现业务逻辑的调用。 自定义标签的优点如下: 减少 JSP 页面对脚本的需求和依赖性 将 JSP 页面和业务逻辑分开,增加了程序的可维护性 可重复调用相同的业务逻辑,增加了程序的可重用性 使用自定义标签步骤如下: 自定义标签实现类 编写 tld 标签库描述文件

  • 我正在尝试创建一个自定义标签类型,该类型将包含一个“淡出”函数。这用于显示将闪烁然后隐藏的消息。 我正在使用Eclipse、SceneBuilder和Javafx。我不知道该怎么做,也不知道是否可能,但到目前为止,我已经做到了: 这显然行不通。 这是我第一次在一个文件中处理凌乱的代码(因此,我尝试将代码从版本1拉入一个新的“对象”,我可以在多个类中使用它): 如果您有任何建议或帮助,我们将不胜感激