我的活动使用ActionBar.setSubtitle
功能显示当前显示的文件系统位置的完整路径。这意味着朝向字幕末尾的子字符串比开头更相关,所以我想我会在开头而不是结尾覆盖ActionBar
样式到ellipsize文本,如下所示:
RES /值/的themes.xml
<style name="Theme.Holo" parent="android:Theme.Holo">
<!-- Action bar styles -->
<item name="android:actionBarStyle">@style/Widget.Holo.ActionBar</item>
</style>
RES /值/ styles.xml
<style name="Widget.Holo.ActionBar" parent="@android:style/Widget.Holo.ActionBar">
<item name="android:subtitleTextStyle">@style/TextAppearance.Holo.Widget.ActionBar.Subtitle</item>
</style>
<style name="TextAppearance.Holo.Widget.ActionBar.Subtitle"
parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Subtitle">
<item name="android:ellipsize">start</item>
</style>
当我将其安装到我的ICS设备(Nexus S)上时,文本仍然(错误地)在最后进行了椭圆化处理。如果我修改我的TextAppearance.Holo.Widget.ActionBar.Subtitle
版本以包含android:textSize
的项目,则字幕的文本大小会相应地改变,所以看起来好像我正在以正确的方式进行调整;我无法弄清楚为什么它不尊重我的android:ellipsize
覆盖。
将所有这些放入问题格式:如何使用样式/主题覆盖android:ellipsize
中字幕视图的ActionBar
属性?
答案 0 :(得分:10)
在我看来,主题和样式是不可能的,但我找到了一种在运行时设置ellipsize值的解决方法。
最难的是找到标题(或副标题)TextView,因为这个视图的id是在内部的android包中。
所以你需要在项目中创建存根类
package com.android.internal;
public class R {
public static final class id {
public static int action_bar_title = 0;
public static int action_bar_subtitle = 0;
}
}
之后,您需要在代码中找到此视图(我使用以下代码执行此操作,它适用于sherlock和默认操作栏)
public class ActionBarUtils {
public static TextView getActionbarTitle(Activity activity) {
TextView title = (TextView) activity.findViewById(R.id.abs__action_bar_title);// for ActionBarSerlock
if (title == null) title = (TextView) activity.findViewById(com.android.internal.R.id.action_bar_title);// for default action bar
return title;
}
}
现在您可以在活动代码中设置ellipsize值:
getActionBarTitle().setEllipsize(TextUtils.TruncateAt.MIDDLE)
PS: 确保在标题可见时调用getActionBarTitle(在setDisplayShowTitleEnabled(true)调用之后),否则你将获得NullPointerException。
PPS: 如果使用proguard混淆,则应添加proguard.cfg:
-keep class com.android.internal.R*{
*;
}