2012-01-15 38 views
4

我的活动利用ActionBar.setSubtitle函数来显示当前显示的文件系统位置的完整路径。这意味着,对字幕结束的子字符串比年初增加有关,所以我想我会重写ActionBar风格在开局就ellipsize文本,而不是结束,像这样:重写android:操作栏上的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覆盖。

把所有这些置于问题格式中:如何使用样式/主题覆盖ActionBar中字幕视图的android:ellipsize属性?

回答

10

在我看来,这是不可能与主题和样式,但我找到了一种解决方法来设置运行时的ellipsize值。

最困难的是找到标题(或字幕)的TextView,因为这个视图的id是在内部的android包中。

所以你需要在项目中创建stub类

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; 
} 

} 

之后,你需要找到在这个代码视图(我这样做是用下面的代码,它的工作原理都与福尔摩斯和默认为其他动作)

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: 请确保您在标题可见时(在setDisplayShowTitleEnabled(true)调用后)调用getActionBarTitle,否则您将得到NullPointerException。

PPS: 如果使用ProGuard的混淆,你应该增加在proguard.cfg:

-keep class com.android.internal.R*{ 
    *; 
} 
+2

这似乎是一个更好的方式去TextView的参考:HTTP://blog.wu-man。 com/2011/12/actionbar-api-provided-by-google-on.html避免创建'R'类... – poshaughnessy 2012-12-13 14:56:11

+0

@poshaughnessy我想我喜欢你使用'Resources#getIdentifier()'链接的方法有点比添加一个虚假的Android内部类到一个项目。 – slyfox 2013-01-17 20:40:00