在ActionBar字幕上覆盖android:ellipsize

时间:2012-01-15 11:57:41

标签: android android-actionbar

我的活动使用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属性?

1 个答案:

答案 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*{
    *;
}