在ActionBar字幕上覆盖android:ellipsize

sly*_*fox 4 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

当我将其安装到我的ICS设备(Nexus S)上时,文本仍然(错误地)在最后进行了椭圆化处理.如果我修改我的版本TextAppearance.Holo.Widget.ActionBar.Subtitle以包含一个项目android:textSize,字幕的文本大小会相应地改变,所以看起来好像我正在以正确的方式探索; 我只是无法弄清楚为什么它不尊重我的android:ellipsize覆盖.

将所有这些放入问题格式:如何使用样式/主题覆盖android:ellipsize字幕视图的属性ActionBar

wil*_*dev 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;
}

}
Run Code Online (Sandbox Code Playgroud)

之后,您需要在代码中找到此视图(我使用以下代码执行此操作,它适用于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;
}
}
Run Code Online (Sandbox Code Playgroud)

现在您可以在活动代码中设置ellipsize值:

getActionBarTitle().setEllipsize(TextUtils.TruncateAt.MIDDLE)
Run Code Online (Sandbox Code Playgroud)

PS:确保在标题可见时调用getActionBarTitle(在setDisplayShowTitleEnabled(true)调用之后),否则你将获得NullPointerException.

PPS:如果你使用proguard混淆,你应该添加proguard.cfg:

-keep class com.android.internal.R*{
    *;
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是获取TextView引用的更好方法:http://blog.wu-man.com/2011/12/actionbar-api-provided-by-google-on.html避免创建'R'类. .. (2认同)