我正在尝试在ActionBar
标签标题上设置自定义字体。
我看到更多的开发者要求在SO上采用正确的方法(例如How to customize the font of Action Bar tabs& How (if possible) could I set a custom font in a ActionBar on tab text with a font in my assets folder?),但没有答案。
到目前为止,我采用了两种方法:
1)第一个是受启发这个SO question并且包含为每个标签充气自定义布局:
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,标签标题会显示在溢出列表(Spinner / Drop-down)中,但选中的值显示为空。当您单击此列表的项目时,所有这些视图都会消失。例如,当用户扩展搜索操作视图,导致android将选项卡显示为下拉列表时,这尤其令人讨厌。
2)我尝试了另一种方法[{3}},其中涉及使用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));
可以看到Class TypefaceSpan here。
因此...
有没有人知道使用“/ assets / fonts / ...”字体设置ActionBar
标签'标题的正确方法?任何帮助将不胜感激。
修改
关于第二种方法的更多信息。 我正在使用的TypefaceSpan类实际上是here的一个分支,由用户@twaddington在此处提供:android.text.style.TypefaceSpan
编辑2:
在上一个链接中,评论声明:“如果textAllCaps属性在底层TextView上设置为true(例如通过主题),那么自定义字体将不会出现。这对我来说是一个问题当我将此技术应用于操作栏标签项“时。
我已经更改了我的样式,因此textAllCaps设置为false,现在第二种方法似乎有效。我会测试一下并发布结果。
结论:
上一次编辑中的解决方案似乎有效。
将@ CommonsWare的答案标记为正确的相关性。
@PeteH的PS-EDIT:
我6个月前问过这个问题,所以我不记得所有的细节了。我相信对于这个应用程序,我最终采用了不同的导航方法。我现在可以在应用中找到的所有内容(关于刷卡...)是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中,我有Actionbar的Tab Text样式,如下所示:
<!-- 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>
答案 0 :(得分:4)
TypefaceSpan
仅适用于三种内置字体。
话虽如此,forking TypefaceSpan
使用从本地文件路径加载Typeface
的那个应该不那么难。不是将构造函数中的String
视为面部族名称,而是将其视为本地文件路径,调整apply()
以从中加载它。 Typeface
本身不是Parcelable
,因此您需要使用该路径。
从资产中获取Typeface
的问题是TypefaceSpan
需要访问AssetManager
,并且在放入和重建之后,它不会轻易访问Parcel
。
我没有使用过你的第一种技术,但我对你遇到问题并不感到惊讶。
您可能还会考虑完全删除操作栏标签并切换到带有标签指示符的ViewPager
,因为您可以更轻松地设置样式,例如杰克沃顿的TabPageIndicator
。
答案 1 :(得分:0)
首先看一下这个例子: [http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-views-1/][1]
然后创建一个布局,并使用以下代码将其命名为tab_title:
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/action_custom_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="My Custom title"
android:textColor="#fff"
android:textSize="18sp"
android:paddingTop="5dp" />
然后只需在Androidhive项目的MainActivity的onCreate()方法中,只需更改:
// Adding Tabs
for (String tab_name : tabs) {
actionBar.addTab(actionBar.newTab().setText(tab_name)
.setTabListener(this));
}
要:
// Adding Tabs
for (String tab_name : tabs) {
Tab tab = actionBar.newTab();
TextView customTabView = (TextView)getLayoutInflater().inflate(R.layout.tab_title, null);
customTabView.setText(tab_name);
Typeface typface2=Typeface.createFromAsset(getAssets(),"fonts/titr.TTF");
customTabView.setTypeface(typface2);
tab.setTabListener(this);
tab.setCustomView(customTabView);
actionBar.addTab(tab);
}
(无需说你必须将fonts / titr.TTF更改为资产目录和文件名) 联合它!!